node.js - 通过 FindWindowW 返回的 HWND 句柄与顶级父级不同
问题描述
我正在尝试创建一个实用程序,该实用程序将根据预先分配的热键有选择地隐藏和显示窗口,并且我正在使用 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个主要问题:
当我尝试隐藏和/或最小化打开的计算器窗口时,单击它时似乎无法再次显示它。预览图像消失,我注意到抛出了“进程代理”。
我似乎无法真正找到使用 Spy++ 等工具提供的窗口句柄,这使得调试以查看是否需要获取不同的句柄有点困难。父级计算器窗口的句柄似乎不匹配,我验证它是同一个工具。
我还想指出一些体面的资源来帮助自我教育,这样我将来可以更好地解决这个问题。
非常感谢!
解决方案
首先,我赞同 Hans Passant 的言论,即您最好不要尝试使用像计算器这样的 UWP 应用程序,但话说回来,这些应用程序不会消失,所以您可能还是想尝试一下。
外壳似乎不喜欢您尝试隐藏 UWP 应用程序(不过,Win32 应用程序工作正常,请看图)。正如您所观察到的,它的图标在工具栏中仍然可见,但在隐藏窗口时表现得很奇怪。所以,简短的版本,不要那样做。
相反,试试这个:
PostMessage (hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
然后事情会好很多,尽管用户当然仍然可以通过重新打开窗口来撤消所有的好工作。
至于 Spy++,我可以使用“查找工具”(菜单 -> 搜索 -> 查找窗口)轻松定位 UWP 应用的顶级窗口。之后您只需在窗口层次结构中向上走几级,直到到达您真正想要的那个。
Spy++ 似乎无法记录发送到这样一个窗口的消息,但是,请参阅(无耻插件):为什么 Spy++ 不能看到发送到 UWP 应用程序的消息?. 我打算在有时间的时候多研究一下。
最后,请问“抛出一个“流程代理”是什么意思?我不明白那个评论。有一个叫做RuntimeBroker的东西,它出现在 Process Explorer 中,并且似乎以某种方式与 UWP 应用程序连接,但我不知道这是否是你的意思,即使你这样做我也不知道。
推荐阅读
- angular - 向 ng-container 添加动画
- html - 在 react-quill 编辑器中直接输入 HTML 标记
- numpy - 如何将 numpy 数组作为逻辑回归的输入?
- php - PHPExcel:某些行在导入时未在我的 .xls 文件中导出,但在我回显输出时显示?
- c# - 如何找出哪个Windows进程正在使用文件?
- javascript - 如何确定同一数组中是否存在重复值?
- php - 如何在 laravel 中为我的购物项目创建 cms 用户类型和常规配置文件
- java - 在 BaseFragment 中使用 dagger2 实例化视图模型
- javascript - 为什么 @ViewChild(NgbDropdown) 在我的组件中不起作用?
- amazon-web-services - 具有 MariaDB 成本的 Amazon RDS