mfc进程方面处理

// 获取某个进程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;
}

 

posted @ 2024-03-20 17:48  leochan007  阅读(3)  评论(0编辑  收藏  举报