2016-05-23 3 views
1

Я искал NPM для некоторого пакета, который позволит мне, для Windows только поддержка Linux и OSX не требуется, чтобы скрыть определенные открытые окна. Например, я хотел бы иметь возможность скрывать и отображать окно блокнота, однако, если у меня открыто несколько окон блокнота, я не хочу их скрывать, я хочу скрыть только один конкретный. Я хотел бы, чтобы это было скрыто от панели задач, а не просто, чтобы прозрачность была невидимой.Скрытие других окон/программ от Electron App

Кто-нибудь знает о пакете NPM с этой функциональностью или если это возможно?

Я считаю, что на одинаковом расстоянии от этого в C# будет ShowWindow из user32.dll

Спасибо.

ответ

2

Мне не удалось найти готовое решение для вас, но вы намекаете на ответ на свою проблему в своем вопросе. user32.dll доступен из node.js/electron, используя node-ffi.

Для установки 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 

Это последний является восстановление родных двоичных файлов для 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); 

Launch блокнота и убедитесь, что заголовок окна "Untitled - Notepad. Если вы запустите приложение Electron, окно должно скрыться, но процесс остается. Я разместил видеоролик, демонстрирующий, что это действительно работает: https://youtu.be/4thydneqtyQ

Что касается второй половины вашего вопроса ...

Вам нужен какой-то способ, чтобы определить, какие окна вы хотите скрыть. Если вы можете использовать заголовок Window, то вышеуказанный метод будет работать.

Если вы не можете, вам понадобится другой способ оценить окно через API Win32 и сделать определение. Вы можете использовать EnumWindows (https://msdn.microsoft.com/en-us/library/windows/desktop/ms633497(v=vs.85).aspx) через FFI, чтобы получить каждое окно, а затем использовать другие функции для его проверки и определения.

Если вы точно укажите, как вы планируете дифференцироваться, я посмотрю, смогу ли я найти для вас конкретное решение. В противном случае мое предложение - изучить, как это сделать с помощью user32.dll с помощью C# или C++, а затем перевести результат в Electron с помощью FFI.

+0

О, черт возьми, ты настоящий МвП. Я не могу вас достаточно поблагодарить, вы не были выше и выше требования долга, такие люди, как вы, которые распространяли доброту во всем мире, я надеюсь отблагодарить некоторое время как-то. Спасибо вам, это очень ценится. – Ducky

+0

Спасибо за добрые слова! :-) Мне потребовалось некоторое время, чтобы FFI корректно работала с Electron. Сказав это, если у вас возникнут какие-либо проблемы, дайте мне знать, и я посмотрю, что я могу сделать, чтобы помочь. –

+0

Эй, я нашел это http://stackoverflow.com/a/10819641/3055031 для использования EnumWindows из User32.dll, завтра я собираюсь попытаться обернуть голову тем, как заставить их работать в узле. Просто я не знаю, какой тип переменной я бы наметил «WNDENUMPROC». Еще раз спасибо за вашу помощь, это очень ценится. – Ducky

 Смежные вопросы

  • Нет связанных вопросов^_^