通过FindWindowW返回的HWND句柄与顶级父级不同

时间:2018-05-31 08:08:28

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

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

我使用FindWindowW调用来获取窗口的句柄作为测试(在我的例子中,一个带有“Calculator - Calculator”文本的窗口,它与一个打开的计算器窗口匹配)并在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. 当我尝试隐藏和/或最小化打开的计算器窗口时,我似乎无法在点击它时再次显示它。预览图像消失了,我注意到抛出了“Process Broker”。

  2. 我似乎无法找到像Spy ++这样的工具给出的窗口句柄,这使得调试有点难以查看是否需要抓取不同的句柄。父级计算器窗口的句柄似乎不匹配,我验证它是相同的工具。

  3. 我还想指出一些合适的资源来帮助自我教育,以便将来更好地解决这个问题。

    非常感谢!

1 个答案:

答案 0 :(得分:2)

首先,我回应Hans Passant的评论,你可能最好不要尝试使用像计算器这样的UWP应用程序,但是这些应用程序再也不会消失所以也许你可能想尝试一下。

shell似乎并不欣赏你试图隐藏UWP应用程序(Win32应用程序工作正常但是,如图)。正如您所观察到的,它的图标在工具栏中仍然可见,但在隐藏窗口时表现异常。所以,简短的版本,不要这样做。

相反,试试这个:

PostMessage (hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);

然后事情变得更好了,尽管用户仍然可以通过重新打开窗口撤消所有好工作。

至于Spy ++,我可以使用&#39; Finder工具找到UWP应用程序的顶级窗口。 (菜单 - &gt;搜索 - &gt;查找窗口)。您只需要在窗口层次结构中走几层,直到找到您真正想要的层次。

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

最后,你是什么意思&#34; a&#34;流程经纪人&#34;扔了#39;请?我不明白这个评论。有一些名为 RuntimeBroker 的东西,它出现在Process Explorer中,并且似乎以某种方式与UWP应用程序相关联,但我不知道这是不是你的意思意思是,即使你这样做,我对此也一无所知。