在给定窗口句柄的情况下,我如何确定该窗口句柄是否是Windows UI的一部分,而不是应用程序的一部分



我正在编写一个脚本(在C#中,但几乎所有内容都通过pinvoke处理(,该脚本可以在鼠标指针下找到窗口句柄,并允许用户对其执行一些操作(主要是自定义的有界窗口捕捉相关功能(。

我已经把它做到了效果非常好的地步它可以移动桌面和任务栏。当然,这是我实际上并不想让它做的事情。我只想让它在用户创建的窗口上工作;比如Chrome、Word、记事本或Teams。

我能看一些方便的描绘吗?我尝试过查看窗口样式或PID,但我没有看到如何检测"错误"的明显模式;这个"窗口"由Windows外壳所有;。

我意识到——我已经检查了窗口句柄是否属于explorer.exe,但这不起作用,因为它会阻止用户移动常规文件浏览器。

经过一番挖掘,我发现了这个问题,它引用了"GetDesktopWindow(("以及";GetShellWindow(("pinvoke函数。使用GetShellWindow((api及其pid,我能够确定windows shell的进程ID,并将其与我当前移动的应用程序的进程ID进行比较。最后,由于文件资源管理器窗口是资源管理器过程的一部分,我检查了窗口是否有";文件资源管理器";正如它的标题,或者如果它的任何父窗口这样做。

[DllImport("user32.dll", SetLastError = false)]
private static extern IntPtr GetShellWindow();
[DllImport("user32.dll", SetLastError = true)]
private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out IntPtr lpdwProcessId);
public bool IsPartOfWindowsUI
{
get
{
var desktopwindow = new WindowRef(GetShellWindow());
return (desktopwindow.ThreadProcessID == ThreadProcessID &&
//Check to see if title of this window or it's parents are
//Basic file explorer windows 
!TitleTree.Contains("File Explorer"));
}
}

相关内容

最新更新