不知何故,这个有趣的 STARTUPINFO 和 SetWindowPos 组合似乎起作用了:
#include "windows.h"
#include <iostream>
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
const DWORD myProcessId = (DWORD) lParam;
DWORD processId;
GetWindowThreadProcessId(hWnd, &processId);
if (processId == myProcessId) {
SetWindowPos(hWnd, 0, 1, 1, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}
return TRUE;
}
int _tmain(int argc, _TCHAR* argv[])
{
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.wShowWindow = SW_SHOWNORMAL;
si.dwFlags = STARTF_USESHOWWINDOW;
wchar_t cmdline[33000] = L" -f";
PROCESS_INFORMATION pi;
BOOL x = CreateProcess(L"c:\\Windows\\System32\\sndvol.exe", &cmdline[0], 0, 0, true, 0, 0, 0, &si, &pi);
//std::cerr << x << " " << GetLastError() << std::endl;
WaitForInputIdle(pi.hProcess, 100);
for (int i = 0; i < 200; ++i)
{
x = EnumWindows(EnumWindowsProc, (LPARAM) pi.dwProcessId);
//std::cerr << x << " " << GetLastError() << std::endl;
Sleep(20);
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
您可能想尝试更多以获得更好的解决方案(例如,观察回调是否成功移动窗口至少k
多次。我尝试检查一次成功但它并没有总是移动窗口。另外请务必检查您的进程是否处理仍然引用一个有效的过程 - 你不想写一个无限循环。)。
尽管通过最新的编辑,该解决方案变得非常可靠。