예제 #1
0
파일: CaretPos.cs 프로젝트: AndreWin/Mahou
 public static bool GetGuiInfo(uint thread_id, ref WinAPI.GUITHREADINFO gui_info)
 {
     if (!WinAPI.GetGUIThreadInfo(thread_id, ref gui_info))
     {
         Logging.Log("Error getting GUI info for thread id: [" + thread_id + "], L-W32Err: [" + Marshal.GetLastWin32Error() + "].", 2);
         return(false);
     }
     return(true);
 }
예제 #2
0
        /// <summary>
        /// Returns focused or foreground window.
        /// </summary>
        /// <returns>IntPtr(HWND)</returns>
        public static IntPtr ActiveWindow()
        {
            IntPtr awHandle = IntPtr.Zero;
            var    gui      = new WinAPI.GUITHREADINFO();

            gui.cbSize = Marshal.SizeOf(gui);
            WinAPI.GetGUIThreadInfo(WinAPI.GetWindowThreadProcessId(WinAPI.GetForegroundWindow(), IntPtr.Zero), ref gui);
            awHandle = gui.hwndFocus;
            if (awHandle == IntPtr.Zero)
            {
                awHandle = WinAPI.GetForegroundWindow();
            }
            return(awHandle);
        }
예제 #3
0
파일: CaretPos.cs 프로젝트: AndreWin/Mahou
        /// <summary>
        /// Gets caret position from focused window or from focused control in window.
        /// </summary>
        /// <returns>Point</returns>
        public static Point GetCaretPointToScreen(out Point caretOnlyPos)
        {
            var LuckyNone = new Point(77777, 77777);

            caretOnlyPos = LuckyNone;
            var    _cThr_id  = WinAPI.GetCurrentThreadId();
            var    _pntCR    = new Point(0, 0);
            var    _fwFCS_Re = new WinAPI.RECT(0, 0, 0, 0);
            var    _fw       = WinAPI.GetForegroundWindow();
            uint   dummy     = 0;
            var    _fwThr_id = WinAPI.GetWindowThreadProcessId(_fw, out dummy);
            IntPtr _fwFCS    = IntPtr.Zero;
            var    _clsNMb   = new StringBuilder(256);
            string _clsNMfw  = "";

            Logging.Log("_c HWND: [" + MMain.mahou.Handle + "], _c ThrId: [" + _cThr_id + "], " + "_fw HWND: [" + _fw + "]" + ", _fw ThrId: " + _fwThr_id + ".");
            if (_fwThr_id != _cThr_id)
            {
                var gti = new WinAPI.GUITHREADINFO();
                gti.cbSize = Marshal.SizeOf(gti);
                if (!GetGuiInfo(_fwThr_id, ref gti))
                {
                    return(LuckyNone);
                }
                _fwFCS = gti.hwndFocus;
                WinAPI.GetClassName(_fw, _clsNMb, _clsNMb.Capacity);
                _clsNMfw = _clsNMb.ToString();
                if (_fwFCS != IntPtr.Zero && _fwFCS != _fw)
                {
                    var _fwFCSThr_id = WinAPI.GetWindowThreadProcessId(_fwFCS, out dummy);
                    var gtiFCS       = new WinAPI.GUITHREADINFO();
                    gtiFCS.cbSize = Marshal.SizeOf(gtiFCS);
                    if (!GetGuiInfo(_fwFCSThr_id, ref gtiFCS))
                    {
                        return(LuckyNone);
                    }
                    Logging.Log("_fcs: [" + _fwFCS + "]." + "_fw classname = [" + _clsNMb + "], " + "_fcs thread_id = [" + _fwFCSThr_id + "].");
                    WinAPI.GetClassName(_fwFCS, _clsNMb, _clsNMb.Capacity);
                    Logging.Log("_fcs classname = [" + _clsNMb + "].");
                    WinAPI.GetWindowRect(_fwFCS, out _fwFCS_Re);
                    _pntCR = new Point(gtiFCS.rectCaret.Left, gtiFCS.rectCaret.Top);
                }
                else
                {
                    _pntCR = new Point(gti.rectCaret.Left, gti.rectCaret.Top);
                    WinAPI.GetWindowRect(_fw, out _fwFCS_Re);
                }
                if (_clsNMfw == "PX_WINDOW_CLASS" && MMain.mahou.MCDSSupport)
                {
                    System.Threading.Tasks.Task.Factory.StartNew(GetDataFromMCDS);
                    var CaretToScreen = new Point(_fwFCS_Re.Left, _fwFCS_Re.Top);
                    CaretToScreen.X += _CaretST3.X + SidebarWidth + MMain.mahou.MCDS_Xpos_temp;
                    if (viewID == 4)
                    {
                        WinAPI.RECT clts = new WinAPI.RECT(0, 0, 0, 0);
                        WinAPI.GetWindowRect(WinAPI.GetForegroundWindow(), out clts);
                        CaretToScreen.Y  = clts.Bottom - MMain.mahou.MCDS_BottomIndent_temp - 45 + MMain.mahou.MCDS_Ypos_temp;
                        CaretToScreen.X -= 20;
                    }
                    else
                    {
                        CaretToScreen.Y += _CaretST3.Y + MMain.mahou.MCDS_TopIndent_temp + MMain.mahou.MCDS_Ypos_temp;
                    }
                    caretOnlyPos = _CaretST3;
                    return(CaretToScreen);
                }
                else
                {
                    if (_pntCR.Equals(new Point(0, 0)))
                    {
                        return(LuckyNone);
                    }
                    var _fwTitle = new StringBuilder(128);
                    WinAPI.GetWindowText(_fw, _fwTitle, 127);
                    Logging.Log("CaretPos = x[" + _pntCR.X + "], y[" + _pntCR.Y + "].");
                    // Do not display caret for these classes:
                    var _clsNM = _clsNMb.ToString();
                    if (new Regex("[L][I][S][T][B][O][X]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        new Regex("[B][U][T][T][O][N]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        new Regex("[C][H][E][C][K][B][O][X]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        new Regex("[C][O][M][B][O][B][O][X]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        new Regex("[L][I][S][T][V][I][E][W]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        new Regex("[P][A][G][E][C][O][N][T][r][o][l]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        (new Regex("[W][I][N][D][O][W]", RegexOptions.IgnoreCase).IsMatch(_clsNM) && _clsNM != "MozillaWindowClass") ||
                        new Regex("[S][Y][S][L][I][N][K]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        new Regex("[T][R][E][E]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        new Regex("[H][E][L][P][F][O][R][M]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        new Regex("[T][M][A][I][N][F][O][R][M]", RegexOptions.IgnoreCase).IsMatch(_clsNM) ||
                        new Regex("[B][T][N]", RegexOptions.IgnoreCase).IsMatch(_clsNM) || _clsNM.Contains("Afx:") ||
                        _clsNM == "msctls_trackbar32" || _clsNM.Contains("wxWindow") ||
                        _clsNM == "SysTabControl32" || _clsNM == "DirectUIHWND" ||
                        _clsNM == "Static" || _clsNM == "NetUIHWND" || _clsNMfw == "MSPaintApp" ||
                        _clsNM == "PotPlayer" || _clsNM == "MDIClient" ||
                        _clsNMfw == "#32770" && (new Regex("[У][Д][А][Л][И][Т][Ь]", RegexOptions.IgnoreCase).IsMatch(_fwTitle.ToString()) ||
                                                 (new Regex("[D][E][L][E][T][E]", RegexOptions.IgnoreCase).IsMatch(_fwTitle.ToString()))))
                    {
                        return(LuckyNone);
                    }
                    if (_clsNM.Contains("SharpDevelop.exe"))
                    {
                        _pntCR.Y += 28; _pntCR.X += 3;
                    }
                    Logging.Log("Get caret position finished successfully.", 0);
                    caretOnlyPos = _pntCR;
                    return(new Point(_fwFCS_Re.Left + _pntCR.X, _fwFCS_Re.Top + _pntCR.Y));
                }
            }
            return(LuckyNone);
        }
예제 #4
0
        /// <summary>
        /// Gets caret position from focused window or from focused control in window.
        /// </summary>
        /// <returns>Point</returns>
        public static Point GetCaretPointToScreen(out Point caretOnlyPos)
        {
            var LuckyNone = new Point(77777, 77777);

            caretOnlyPos = LuckyNone;
            var    _cThr_id  = WinAPI.GetCurrentThreadId();
            var    _pntCR    = new Point(0, 0);
            var    _fwFCS_Re = new WinAPI.RECT(0, 0, 0, 0);
            var    _fw       = WinAPI.GetForegroundWindow();
            uint   dummy     = 0;
            var    _fwThr_id = WinAPI.GetWindowThreadProcessId(_fw, out dummy);
            IntPtr _fwFCS    = IntPtr.Zero;
            var    _clsNMb   = new StringBuilder(256);
            string _clsNMfw  = "";

            Logging.Log("_c HWND: [" + MMain.MAHOU_HANDLE + "], _c ThrId: [" + _cThr_id +
                        "], " + "_fw HWND: [" + _fw + "]" + ", _fw ThrId: " + _fwThr_id + ".");
            if (_fwThr_id != _cThr_id)
            {
                var gti = new WinAPI.GUITHREADINFO();
                gti.cbSize = Marshal.SizeOf(gti);
                if (!GetGuiInfo(_fwThr_id, ref gti))
                {
                    return(LuckyNone);
                }
                _fwFCS = gti.hwndFocus;
                WinAPI.GetClassName(_fw, _clsNMb, _clsNMb.Capacity);
                _clsNMfw = _clsNMb.ToString();
                if (_fwFCS != IntPtr.Zero && _fwFCS != _fw)
                {
                    var _fwFCSThr_id = WinAPI.GetWindowThreadProcessId(_fwFCS, out dummy);
                    var gtiFCS       = new WinAPI.GUITHREADINFO();
                    gtiFCS.cbSize = Marshal.SizeOf(gtiFCS);
                    if (!GetGuiInfo(_fwFCSThr_id, ref gtiFCS))
                    {
                        return(LuckyNone);
                    }
                    Logging.Log("_fcs: [" + _fwFCS + "]." + "_fw classname = [" + _clsNMb + "], " + "_fcs thread_id = [" + _fwFCSThr_id + "].");
                    WinAPI.GetClassName(_fwFCS, _clsNMb, _clsNMb.Capacity);
                    Logging.Log("_fcs classname = [" + _clsNMb + "].");
                    WinAPI.GetWindowRect(_fwFCS, out _fwFCS_Re);
                    _pntCR = new Point(gtiFCS.rectCaret.Left, gtiFCS.rectCaret.Top);
                }
                else
                {
                    _pntCR = new Point(gti.rectCaret.Left, gti.rectCaret.Top);
                    WinAPI.GetWindowRect(_fw, out _fwFCS_Re);
                }
                if (_clsNMfw == "PX_WINDOW_CLASS" && MMain.mahou.MCDSSupport)
                {
                    System.Threading.Tasks.Task.Factory.StartNew(GetDataFromMCDS);
                    var CaretToScreen = new Point(_fwFCS_Re.Left, _fwFCS_Re.Top);
                    CaretToScreen.X += _CaretST3.X + SidebarWidth + MMain.mahou.MCDS_Xpos_temp;
                    if (viewID == 4)
                    {
                        WinAPI.RECT clts = new WinAPI.RECT(0, 0, 0, 0);
                        WinAPI.GetWindowRect(WinAPI.GetForegroundWindow(), out clts);
                        CaretToScreen.Y  = clts.Bottom - MMain.mahou.MCDS_BottomIndent_temp - 45 + MMain.mahou.MCDS_Ypos_temp;
                        CaretToScreen.X -= 20;
                    }
                    else
                    {
                        CaretToScreen.Y += _CaretST3.Y + MMain.mahou.MCDS_TopIndent_temp + MMain.mahou.MCDS_Ypos_temp;
                    }
                    caretOnlyPos = _CaretST3;
                    return(CaretToScreen);
                }
                else
                {
                    if (_pntCR.Equals(new Point(0, 0)))
                    {
                        return(LuckyNone);
                    }
                    Logging.Log("CaretPos = x[" + _pntCR.X + "], y[" + _pntCR.Y + "].");
                    var _clsNM = _clsNMb.ToString().ToLower();
                    // Do not display caret for these classes:
                    if (_clsNM.Contains("listbox") || _clsNM.Contains("button") ||
                        _clsNM.Contains("checkbox") || _clsNM.Contains("combobox") ||
                        _clsNM.Contains("listview") || _clsNM.Contains("pagecontrol") ||
                        (_clsNM.Contains("window") && !_clsNM.Contains("mozilla")) || _clsNM.Contains("syslink") ||
                        _clsNM.Contains("tree") || _clsNM.Contains("helpform") ||
                        _clsNM.Contains("tmainform") || _clsNM.Contains("btn") ||
                        _clsNM.Contains("удалить") || _clsNM.Contains("delete") ||
                        _clsNM.Contains("afx:") ||
                        _clsNM == "msctls_trackbar32" || _clsNM.Contains("wxwindow") ||
                        _clsNM == "systabcontrol32" || _clsNM == "directuihwnd" ||
                        _clsNM == "static" || _clsNM == "netuihwnd" || _clsNMfw == "mspaintapp" ||
                        _clsNM == "potplayer" || _clsNM == "mdiclient" ||
                        (_clsNMfw == "#32770" && _clsNM != "edit"))
                    {
                        return(LuckyNone);
                    }
                    if (_clsNM.Contains("sharpdevelop.exe"))
                    {
                        _pntCR.Y += 28; _pntCR.X += 3;
                    }
                    Logging.Log("Get caret position finished successfully.", 0);
                    caretOnlyPos = _pntCR;
                    return(new Point(_fwFCS_Re.Left + _pntCR.X, _fwFCS_Re.Top + _pntCR.Y));
                }
            }
            return(LuckyNone);
        }