从 Electron App 隐藏其他窗口/程序

Duc*_*cky 3 windows hide show-hide node.js electron

我一直在 NPM 中搜索一些包,这些包允许我隐藏特定的打开窗口,仅适用于 Windows 的 Linux 和 OSX 支持是不需要的。例如,我希望能够隐藏和取消隐藏记事本窗口,但是如果我打开了多个记事本窗口,我不想全部隐藏它们,我只想隐藏一个特定的窗口。我希望它从任务栏中隐藏,而不仅仅是将不透明度设置为不可见。

有谁知道具有此功能的 NPM 包,或者甚至可能吗?

我相信 C# 中的等距将是来自 user32.dll 的 ShowWindow

谢谢。

Sha*_*ski 5

我无法为您找到现成的解决方案,但您在问题中暗示了问题的答案。可以使用 node-ffi 从 node.js/electron 访问 user32.dll。

要安装 node-ffi,您需要 node-gyp 及其在 Windows 上的所有依赖项。见https://github.com/nodejs/node-gyp#installation

接下来,您需要执行以下操作:

npm install ffi
npm install electron-rebuild
.\node_modules\.bin\electron-rebuild.cmd
Run Code Online (Sandbox Code Playgroud)

最后一个是为 Electron 重建原生二进制文件。

将以下代码块放在您的 Electron 应用程序中:

var FFI = require('ffi');

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

var user32 = new FFI.Library('user32', {
  'FindWindowW': ['int', ['string', 'string']],
  'ShowWindow': ['int', ['int', 'int']]
});

var handle = user32.FindWindowW(null, TEXT('Untitled - Notepad'));
console.log(handle);
user32.ShowWindow(handle, 0);
Run Code Online (Sandbox Code Playgroud)

启动记事本并确保窗口标题为“无标题 - 记事本”。如果你启动你的 Electron 应用程序,窗口应该隐藏,但过程仍然存在。我发布了一个视频,证明这确实有效:https : //youtu.be/4thydneqtyQ

至于你问题的后半部分......

您需要某种方式来确定要隐藏的窗口。如果您可以使用窗口标题,则上述方法将起作用。

如果你不能,那么你需要有一些其他的方法来通过 Win32 API 评估窗口并做出决定。您可以通过 FFI使用 EnumWindows ( https://msdn.microsoft.com/en-us/library/windows/desktop/ms633497(v=vs.85).aspx ) 来获取每个窗口,然后使用其他函数来检查它并作出决定。

如果您准确提供了您打算如何区分,我会看看我是否可以找到具体的解决方案。否则,我的建议是研究如何使用 C# 或 C++ 通过 user32.dll 执行此操作,然后使用 FFI 将结果转换为 Electron。