我创建了一个程序来识别现有的最大化窗口并使用 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 执行调用。