0

我创建了一个程序来识别现有的最大化窗口并使用 EnumWindows 和 GetWindowPlacement 记录它们的位置。

假设我知道所需 EXE 的位置,我可以通过调用外部进程调用者来打开它。但是识别新打开的窗口并设置其位置的最佳方法是什么?可以安全地假设同名程序可能已经打开(例如,两个 cmd 实例)。

我相信一旦确定了窗口,我就可以使用SetWindowPos设置它的位置。

这是正确的问题吗?有没有办法打开程序并接收 HWND 句柄?

在事件挂钩静脉中,我有以下代码:

HWINEVENTHOOK hook = SetWinEventHook(EVENT_OBJECT_CREATE, EVENT_OBJECT_CREATE, NULL, proc, 0, 0, WINEVENT_OUTOFCONTEXT );

BOOL result = CreateProcess(NULL, szPath, &saProcess, &saThread, FALSE, 0, NULL, NULL, &si, &piProcessC);

if (hook) {
    UnhookWinEvent(hook);
}

它创建了一个钩子,然后创建了一个进程(我正在打开 Notepad++)。

它调用的proc函数是:

void CALLBACK proc(HWINEVENTHOOK hook, DWORD event, HWND hWnd, LONG obj, LONG child, DWORD thr, DWORD time) {
    if (IsWindow(hWnd)){



        WINDOWPLACEMENT *wp = new WINDOWPLACEMENT();
        wp->length = sizeof(WINDOWPLACEMENT);

        GetWindowPlacement(hWnd, wp);
        wp->rcNormalPosition.top = (long) 363;
        wp->rcNormalPosition.bottom = (long) 1021;
        wp->rcNormalPosition.left = (long) 1444;
        wp->rcNormalPosition.right = (long) 2551;


        BOOL tmp = SetWindowPlacement(hWnd, wp);
        cout << "FOUND IT\n";
    }

}

proc 函数似乎没有被调用,所以钩子没有捕获任何东西吗?

哦,我不确定 WINEVENT_OUTOFCONTEXT 是否正确,这只是一个简单的 EXE 执行调用。

4

0 回答 0