如何让窗口在鼠标下正确
本文关键字:鼠标 窗口 | 更新日期: 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;
。