Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何处理外部应用程序窗口?MFC_C++_Mfc_Window_Handler - Fatal编程技术网

C++ 如何处理外部应用程序窗口?MFC

C++ 如何处理外部应用程序窗口?MFC,c++,mfc,window,handler,C++,Mfc,Window,Handler,我需要按名称、id或进程句柄处理另一个正在运行的应用程序。我得到了ID和进程句柄,但我不知道如何得到窗口句柄来更改外部程序标题 这是我的代码: BOOL CFindProcess::OnInitDialog() { CDialogEx::OnInitDialog(); CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_PROCESS); HANDLE hSnap = CreateToolhelp32Snapsh

我需要按名称、id或进程句柄处理另一个正在运行的应用程序。我得到了ID和进程句柄,但我不知道如何得到窗口句柄来更改外部程序标题

这是我的代码:

BOOL CFindProcess::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_PROCESS);
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 proc;
    proc.dwSize = sizeof(PROCESSENTRY32);
    if (Process32First(hSnap, &proc)){
        pComboBox->AddString(proc.szExeFile);
        while (Process32Next(hSnap, &proc)){
            if (0!=wcscmp(proc.szExeFile, L"svchost.exe"))
                pComboBox->AddString(proc.szExeFile);
            if (wcscmp(proc.szExeFile, L"notepad.exe") == 0){
                HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc.th32ProcessID);
                GetProcessId(hProcess);
                AfxMessageBox(L"Handeled");
                //SetWindowText(hProcess, L"Weather");
                CloseHandle(hProcess);
            }
        }
    }
    CloseHandle(hSnap);
    return TRUE;
}

我的问题是如何通过名称或ID获取notepad.exe的窗口句柄,使用MFC处理句柄?

此代码演示了Jerry所指的内容:

struct MYFINDSTRUCT
{
    DWORD dwPID;
    HWND hWnd;
};

BOOL CALLBACK MyWndEnum(HWND hwnd,LPARAM lParam)
{
    MYFINDSTRUCT* pP = (MYFINDSTRUCT*)lParam;
        DWORD dwPID = 0;
    GetWindowThreadProcessId(hwnd,&dwPID);
    if(dwPID==pP->dwPID)
    {
        pP->hWnd = hwnd;
        return 0;
    }
    return 1;
}

HWND GetProcessHWND(unsigned int nPID)
{
    MYFINDSTRUCT p;
    p.hWnd = 0;
    p.dwPID = nPID;
    EnumWindows(MyWndEnum,(LPARAM)&p);
    return p.hWnd;
}

FindWindow
可以按名称查找
EnumWindows
with
GetWindowProcessId
可以将窗口与进程ID匹配起来。据我所知,FindWindow搜索处理应用程序的标题,但不搜索进程名称。标题和流程名称可以不同,对吗?我不明白EnumWindows是如何工作的,你能帮我解释一下吗?是的,FindWindow只按窗口标题和/或类名查找。要按进程ID查找,请枚举窗口,然后为每个窗口调用GetWindowThreadProcessId以查找由正确进程创建的窗口。好的,这很好,但我遇到了一个问题:)HWND tempHWND=GetProcessHWND(GetProcessId(HPProcess));SetWindowText(tempHWND,L“天气”);我现在怎样才能更改标题?SetWindowText不支持HWND i Get IntelliSense:类型为“HWND”的参数与类型为“LPCTSTR”的参数不兼容。这很可能是因为IntelliSense为成员函数SetWindowText(属于CWnd类)提供了MFC函数原型。您需要通过在SetWindowText前面加上前缀来更改作用域::。e、 g.::SetWindowText(tempHWND,L“天气”);