// 获取某个进程ID
DWORD GetTaskManagerProcessId() {
DWORD taskManagerProcessId = 0;
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE) {
// std::cerr << "CreateToolhelp32Snapshot failed: " << GetLastError() << std::endl;
// ::MessageBox(L"123");
return 0;
}
BOOL bMore = Process32First(hProcessSnap, &pe32);
while (bMore) {
if (lstrcmpi(pe32.szExeFile, _T("BCompare.exe")) == 0) {
taskManagerProcessId = pe32.th32ProcessID;
break;
}
bMore = Process32Next(hProcessSnap, &pe32);
}
CloseHandle(hProcessSnap);
return taskManagerProcessId;
}
// 获取进程句柄
struct ProcessWindow
{
DWORD dwProcessId;
HWND hwndWindow;
};
HWND parentWindow;
PROCESS_INFORMATION pi;
// 查找进程主窗口的回调函数
BOOL CALLBACK EnumWindowCallBack(HWND hWnd, LPARAM lParam)
{
ProcessWindow* pProcessWindow = (ProcessWindow*)lParam;
DWORD dwProcessId;
GetWindowThreadProcessId(hWnd, &dwProcessId);
// 判断是否是指定进程的主窗口
if (pProcessWindow->dwProcessId == dwProcessId && IsWindowVisible(hWnd) && GetParent(hWnd) == NULL)
{
pProcessWindow->hwndWindow = hWnd;
HANDLE hProcess = pi.hProcess;
HANDLE hThread = pi.hThread;
// 调整外部程序的窗口风格,以隐藏标准窗口
SetWindowLongPtr(pProcessWindow->hwndWindow, GWL_STYLE, GetWindowLongPtr(pProcessWindow->hwndWindow, GWL_STYLE) & ~WS_CAPTION);
// 设置外部程序的父窗口
SetParent(hWnd, parentWindow);
// 继续执行外部程序
ResumeThread(hThread);
// 清理资源
CloseHandle(hProcess);
CloseHandle(hThread);
return FALSE;
}
return TRUE;
}
HWND CreateMyProcess()
{
STARTUPINFO si;
::ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
//设置进程创建时不显示窗口
si.dwFlags = /*STARTF_USEPOSITION*/STARTF_USESHOWWINDOW;
/*startupInfo.dwX = 600;
startupInfo.dwY = 900;*/
si.wShowWindow = SW_HIDE;
if (::CreateProcess(L"D:\\VS2019\\nestexe3\\nestexe3\\NetAssist.exe", NULL,
NULL, // process security
NULL, // thread security
FALSE, // no inheritance
0, // no startup flags
NULL, // no special environment
NULL, // default startup directory
&si,
&pi))
{
ProcessWindow procwin;
procwin.dwProcessId = pi.dwProcessId;
procwin.hwndWindow = NULL;
// 等待新进程初始化完毕
WaitForInputIdle(pi.hProcess, 5000);
// 查找主窗口
EnumWindows(EnumWindowCallBack, (LPARAM)&procwin);
return procwin.hwndWindow;
}
return NULL;
}