如何让窗口在鼠标下正确

本文关键字:鼠标 窗口 | 更新日期: 2023-09-27 17:54:06

正如我所读的,在鼠标下获得窗口的方法是使用WindowFromPoint,这就是我所做的,但是,它将始终返回我的窗口的窗口句柄,如果我将鼠标放在其他窗口上,它将始终返回我的窗口句柄!

下面是我的代码:
NativeMethods.POINT p;
if (NativeMethods.GetCursorPos(out p))
            {
                IntPtr hWnd = NativeMethods.WindowFromPoint(p);
                NativeMethods.GetWindowModuleFileName(hWnd, fileName, 2000);
string WindowTitle= fileName.ToString().Split('''')[fileName.ToString().Split('''').Length - 1];
// WindowTitle will never change, it will get my window only!
            }
////////////////////////////////////////////////////////////////////////////////////////
static class NativeMethods
        {
            [DllImport("user32.dll")]
            public static extern IntPtr WindowFromPoint(POINT Point);
            [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
            public static extern uint GetWindowModuleFileName(IntPtr hwnd,
                StringBuilder lpszFileName, uint cchFileNameMax);
            [DllImport("user32.dll")]
            public static extern bool GetCursorPos(out NativeMethods.POINT lpPoint);

            [StructLayout(LayoutKind.Sequential)]
            public struct POINT
            {
                public int X;
                public int Y;
                public POINT(int x, int y)
                {
                    this.X = x;
                    this.Y = y;
                }
                public static implicit operator System.Drawing.Point(POINT p)
                {
                    return new System.Drawing.Point(p.X, p.Y);
                }
                public static implicit operator POINT(System.Drawing.Point p)
                {
                    return new POINT(p.X, p.Y);
                }
            }
            [StructLayout(LayoutKind.Sequential)]
            public struct RECT
            {
                public int Left;
                public int Top;
                public int Right;
                public int Bottom;
            }
        }

编辑

当我在WPF中工作时,这里是我在WPF中使用invoke的尝试:

void dispatcherOp_Completed(object sender, EventArgs e)
        {
            System.Threading.Thread thread = new System.Threading.Thread(
                new System.Threading.ThreadStart(
                  delegate()
                  {
                      System.Windows.Threading.DispatcherOperation
                        dispatcherOp = this.Dispatcher.BeginInvoke(
                        System.Windows.Threading.DispatcherPriority.Normal,
                        new Action(
                          delegate()
                          {
                              NativeMethods.POINT p;
                              if (NativeMethods.GetCursorPos(out p))
                              {
                                  IntPtr hWnd = NativeMethods.WindowFromPoint(p);
                                  NativeMethods.GetWindowModuleFileName(hWnd, fileName, 2000);
                                  uint processID = 0;
                                  uint threadID = GetWindowThreadProcessId(hWnd, out processID);
                                  string filename= Process.GetProcessById((int)processID).MainModule.FileName;
                              }
                          }
                      ));
                      dispatcherOp.Completed -= new EventHandler(dispatcherOp_Completed);
                      dispatcherOp.Completed += new EventHandler(dispatcherOp_Completed);
                  }
              ));

            thread.Start();
        }

如何让窗口在鼠标下正确

GetWindowModuleFileName仅限于调用进程,如果传递属于另一个进程的HWND,它将不起作用。

你可以使用HWND &p/调用GetWindowThreadProcessId()获取进程ID,然后可以调用Process.GetProcessById(processId).MainModule.FileName;