【问题标题】:How can I determine if, given a window handle, the window handle is part of the Windows UI as opposed to an application? [closed]如果给定窗口句柄,我如何确定窗口句柄是否是 Windows UI 的一部分而不是应用程序? [关闭]
【发布时间】:2020-08-20 18:41:38
【问题描述】:

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

我已经做到了它真的很好用的地步! 它可以移动桌面和任务栏。当然,这是我实际上不希望它做的事情。我只希望它在用户创建的 Windows 上工作; Chrome、Word、记事本或 Teams 之类的东西。

我可以查看一些方便的描述吗?我试过查看窗口样式或 PID,但我没有看到关于如何检测“这个‘窗口’归 Windows shell 拥有”的明显模式。

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

【问题讨论】:

  • 也许这会有所帮助:(stackoverflow.com/questions/24320758/…)
  • 你真的需要弄清楚你的边界在哪里......有人可以说,即使记事本也绝对是Windows的一部分......之后这个问题应该可以回答了。

标签: c# windows interop pinvoke


【解决方案1】:

经过一番挖掘,我发现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"));
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多