【问题标题】:HWND handle being returned via FindWindowW differs from top-level parent通过 FindWindowW 返回的 HWND 句柄与顶级父级不同
【发布时间】:2018-05-31 08:08:28
【问题描述】:

我正在尝试创建一个实用程序,该实用程序将根据预先分配的热键选择性地隐藏和显示窗口,并且我正在使用 Windows API 代码。

我使用 FindWindowW 调用来获取窗口句柄作为测试(在我的例子中,一个带有文本“计算器 - 计算器”的窗口,它与打开的计算器窗口匹配)并在 ShowWindow 函数中使用该句柄。

代码如下:

    var user32path = 'C:\\Windows\\System32\\user32.dll';


        function TEXT(text){
          return new Buffer(text, 'ucs2').toString('binary');
        }

          var user32 = new FFI.Library(user32path, {
        'FindWindowW': ['int', ['string', 'string']],
        'ShowWindow': ['int', ['int', 'int']],
        'ShowWindowAsync': ['int', ['int', 'int']],
        'FindWindowExW': ['int', ['int', 'int', 'string', 'string']],
        'BringWindowToTop': ['int', ['int']],
        'GetActiveWindow': ['int', ['int']]


        var handle = user32.FindWindowW(null,TEXT("Calculator ‎- Calculator"));

user32.ShowWindow(

handle, 'SW_Hide');

//associatedWindowHandle is a manually-created variable with the Spy++ variable.
//The Spy++ doesn't match and I'm not sure why. 


user32.ShowWindowAsync(activeHandle, 'SW_Hide');

var pruneLength = Object.keys(prunedData).length;

  for (let i = 0; i < pruneLength-1; i++){
    if (Object.entries(prunedData)[i][1] === hotkey){
      for(let j = 1; j <= prunedData.assocWindows.length; j++){

        let associatedWindow = Object.entries(prunedData)[i+1][j].toString();
          let associatedWindowHandle = parseInt(associatedWindow);
        user32.ShowWindowAsync(associatedWindowHandle, 'SW_Hide');
        user32.BringWindowToTop(associatedWindowHandle[i+1][j]);
      }
    }
  }

2 个主要问题:

  1. 当我尝试隐藏和/或最小化打开的计算器窗口时,单击它时似乎无法再次显示它。预览图像消失,我注意到抛出了“进程代理”。

  2. 我似乎无法真正找到使用 Spy++ 等工具提供的窗口句柄,这使得调试以查看是否需要获取不同的句柄有点困难。父级计算器窗口的句柄似乎不匹配,我验证它是同一个工具。

我还想指出一些体面的资源来帮助我在这方面进行自我教育,以便我以后可以更好地解决这个问题。

非常感谢!

【问题讨论】:

  • Win10中的计算器应用发生了变化,不再是Win32桌面应用。现在是一个 UWP 应用程序,它向一个非常不同的鼓手前进。考虑改为在记事本上进行实验。

标签: node.js winapi node.js-addon


【解决方案1】:

首先,我赞同 Hans Passant 的说法,即您最好不要尝试使用像计算器这样的 UWP 应用程序这样做,但是这些应用程序不会消失,所以也许您还是想尝试一下.

shell 似乎不喜欢您尝试隐藏 UWP 应用程序(不过,Win32 应用程序工作正常,请看图)。正如您所观察到的,它的图标在工具栏中仍然可见,但在隐藏窗口时表现得很奇怪。所以,简短的版本,不要那样做。

试试这个:

PostMessage (hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);

然后事情会好很多,尽管用户当然仍然可以通过重新打开窗口来撤消你所有的好工作。

至于 Spy++,我可以使用“查找工具”(菜单 -> 搜索 -> 查找窗口)轻松定位 UWP 应用的顶级窗口。之后,您只需在窗口层次结构中向上走几级,直到到达您真正想要的那个。

Spy++ 似乎无法记录发送到此类窗口的消息,但请参阅(无耻插件):Why can't Spy++ see messages sent to UWP apps?。我打算有时间再研究一下。

最后,请问“抛出一个“流程代理”是什么意思?我不明白那个评论。有一个名为 RuntimeBroker 的东西,它显示在 Process Explorer 中,并且似乎以某种方式与 UWP 应用程序相关联,但我不知道这是否是您的意思,而且我对此一无所知即使你这样做了。

【讨论】:

  • 你知道有没有办法检测一个窗口是Win32还是UWP?我的目标是能够隐藏和显示窗口,无论其格式如何。
  • 它们似乎都有一个顶级窗口类ApplicationFrameWindow,但我敢打赌也有例外。
猜你喜欢
  • 1970-01-01
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多