问题描述
我正在编写一个脚本(使用C#,但是几乎所有内容都是通过pinvoke处理的),该脚本可以找到鼠标指针下方的窗口句柄,并允许用户对其进行一些操作(主要是与自定义绑定窗口捕捉有关)功能)。
我已经知道它确实可以很好地工作了! 它可以移动桌面和任务栏 。当然,这是我实际上不希望这样做的事情。我只希望它能在用户产生的Windows上运行;例如Chrome,Word,记事本或团队。
我可以查看一些方便的描述吗?我曾尝试查看窗口样式或PID,但没有看到明显的模式来检测“ Windows外壳拥有此'窗口'”。
我意识到-我已经检查了窗口句柄是否属于explorer.exe
,但这不起作用,因为它阻止了用户移动常规文件浏览器。
解决方法
经过一些挖掘,我发现this question引用了“ 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"));
}
}