【发布时间】:2014-08-10 07:28:48
【问题描述】:
我无法聚焦另一个进程 ID 的窗口。
当它被最小化时我遇到了问题,我通过测试IsIconic 然后执行ShowWindow 解决了这个问题。但是现在如果进程不是前台进程就不会显示了。
SetForeground 文档说:
关于如何将流程带到前台有什么想法吗?
我看到了这个方法:
EnumWindows((WNDENUMPROC)topenumfunc, processid) ;
但是,如果当前窗口 pid 等于提供给 EnumWindows 函数的 processid 的 pid,这会枚举所有窗口并进行回调测试。我只想在单个窗口上运行。
这是我的FocusWindow 函数:
Cu.import('resource://gre/modules/ctypes.jsm');
var user32 = ctypes.open('user32.dll');
/* http://msdn.microsoft.com/en-us/library/ms633539%28v=vs.85%29.aspx
* BOOL WINAPI SetForegroundWindow(
* __in HWND hWnd
* );
*/
var SetForegroundWindow = user32.declare('SetForegroundWindow', ctypes.winapi_abi, ctypes.bool,
ctypes.int32_t
);
/* http://msdn.microsoft.com/en-us/library/windows/desktop/ms633522%28v=vs.85%29.aspx
* DWORD WINAPI GetWindowThreadProcessId(
* __in_ HWND hWnd,
* __out_opt_ LPDWORD lpdwProcessId
* );
*/
var GetWindowThreadProcessId = user32.declare('GetWindowThreadProcessId', ctypes.winapi_abi, ctypes.unsigned_long, //DWORD
ctypes.int32_t, //HWND
ctypes.unsigned_long.ptr //LPDWORD
);
/* http://msdn.microsoft.com/en-us/library/windows/desktop/ms633507%28v=vs.85%29.aspx
* BOOL WINAPI IsIconic(
* __in HWND hWnd
* );
*/
var IsIconic = user32.declare('IsIconic', ctypes.winapi_abi, ctypes.bool, // BOOL
ctypes.int32_t // HWND
);
/* http://msdn.microsoft.com/en-us/library/windows/desktop/ms633507%28v=vs.85%29.aspx
* BOOL WINAPI ShowWindow(
* __in HWND hWnd
* __in INT nCmdShow
* );
*/
var ShowWindow = user32.declare('ShowWindow', ctypes.winapi_abi, ctypes.bool, // BOOL
ctypes.int32_t, // HWND
ctypes.int // INT
);
var SW_RESTORE = 9;
function FocusWindow(hwnd) {
if (IsIconic(hwnd)) {
console.warn('its minimized so un-minimize it');
//its minimized so unminimize it
var rez = ShowWindow(hwnd, SW_RESTORE);
if (!rez) {
throw new Error('Failed to un-minimize window');
}
}
var rez = SetForegroundWindow(hwnd);
if (!rez) {
console.log('could not set to foreground window for a reason other than minimized, maybe process is not foreground, lets try that now');
var cPid = ctypes.cast(ctypes.voidptr_t(0), ctypes.unsigned_long);
var rez = GetWindowThreadProcessId(hwnd, cPid.address());
if (!rez) {
throw new Error('Failed to get PID');
} else {
console.log('cPid=', cPid, uneval(cPid), cPid.toString());
console.log('trying to set pid to foreground process');
return false;
}
} else {
return rez;
}
}
【问题讨论】:
-
你看
SetForegroundWindow函数的备注了吗? -
是的,我正试图解决这个问题。基本上我正在尝试将
Alt+Tab模拟到一个窗口。我什至找到了SwitchToThisWindow函数,但这太不靠谱了,看看这里,我在自述文件中有一些关于它的不靠谱的注释:GitHubGIST :: Noitidart / _ff-addon-snippet-SwitchToThisWindow -
我发现自己的这个答案的解决方案在这里 - stackoverflow.com/a/32038880/1828637