지난 번, WH_MOUSE에 대해 Global hook을 해서 hwnd를 구하려고 했으나, WH_MOUSE는 Global hook이 지원되지 않는다는 글을 올렸다.
위 참고의 소스에서 마우스 좌표만으로 hwnd를 구하는 방법이 있어, 글을 남긴다.
WindowFromPoint로 hwnd를 구할 수 있다.
// 마우스 좌표를 주면 hwnd를 return한다. [DllImport("user32.dll")] protected static extern IntPtr WindowFromPoint(int x , int y);
#region 프로세스 정보 클래스 class processInfobyMousePosition { #region public 멤버 public int _mousex, _mousey; public IntPtr _hwnd; public string _processname; public string _windowtext; public string _classname; #endregion #region public method public void SetPositon(int x, int y) { if (x >= 0 & y >= 0) { _mousex = x; _mousey = y; _hwnd = GetHandle(); _processname = GetProcessName(_hwnd); _windowtext = GetWindowText(_hwnd); _classname = GetClassName(_hwnd); } } #endregion #region private method private string GetProcessName(IntPtr hWnd) { int pid; GetWindowThreadProcessId(hWnd, out pid); Process proc = Process.GetProcessById(pid); return proc.MainModule.ModuleName; } private IntPtr GetHandle() { return WindowFromPoint(_mousex, _mousey); } private string GetWindowText(IntPtr hWnd) { StringBuilder text = new StringBuilder(256); if (GetWindowText(hWnd, text, text.Capacity) > 0) { return text.ToString(); } return String.Empty; } private string GetClassName(IntPtr hWnd) { StringBuilder className = new StringBuilder(100); if (GetClassName(hWnd, className, className.Capacity) > 0) { return className.ToString(); } return String.Empty; } #endregion #region dll import [DllImport("user32.dll")] protected static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId); [DllImport("user32.dll")] protected static extern IntPtr WindowFromPoint(int x , int y); [DllImport("user32.dll")] protected static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); [DllImport("user32.dll")] protected static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); #endregion } #endregion //
댓글 없음:
댓글 쓰기