首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >js-ctypes聚焦窗口的问题

js-ctypes聚焦窗口的问题
EN

Stack Overflow用户
提问于 2014-08-10 15:28:49
回答 1查看 118关注 0票数 0

我在聚焦另一个进程id的窗口时遇到问题。

当它最小化时,我有问题,我通过测试IsIconic然后执行ShowWindow修复了这个问题。但是现在,如果进程不是前台进程,则不会显示。

SetForeground文档中写道:

关于如何将进程带到前台,有什么想法吗?

我看到了这个方法:

代码语言:javascript
复制
EnumWindows((WNDENUMPROC)topenumfunc, processid) ;

此处使用:http://www.mombu.com/microsoft/windows-programmer-win32/t-bring-process-to-foreground-page2-1656417.html

但是,这会枚举所有窗口并回调测试当前窗口pid是否等于提供给EnumWindows函数的processid的pid。我只想在一个窗口上运行。

这是我的FocusWindow函数:

代码语言:javascript
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2014-08-10 20:43:58

假设有一个父进程和几个子进程,那么它的一个子进程必须以父进程id作为参数执行AllowSetForegroundWindow函数。

然后,父进程可以成功调用SetForegroundWindow

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25226480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档