mfc进程方面处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 获取某个进程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 @   leochan007  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示