【发布时间】: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 个主要问题:
当我尝试隐藏和/或最小化打开的计算器窗口时,单击它时似乎无法再次显示它。预览图像消失,我注意到抛出了“进程代理”。
我似乎无法真正找到使用 Spy++ 等工具提供的窗口句柄,这使得调试以查看是否需要获取不同的句柄有点困难。父级计算器窗口的句柄似乎不匹配,我验证它是同一个工具。
我还想指出一些体面的资源来帮助我在这方面进行自我教育,以便我以后可以更好地解决这个问题。
非常感谢!
【问题讨论】:
-
Win10中的计算器应用发生了变化,不再是Win32桌面应用。现在是一个 UWP 应用程序,它向一个非常不同的鼓手前进。考虑改为在记事本上进行实验。
标签: node.js winapi node.js-addon