在C+中使用进程名称将其带到前窗口+; 我是C++初学者(一直是C),我被提交到了用C++编写的遗留程序的故障诊断/更新。p>

在C+中使用进程名称将其带到前窗口+; 我是C++初学者(一直是C),我被提交到了用C++编写的遗留程序的故障诊断/更新。p>,c++,windows,C++,Windows,我有一个在Windows上运行的进程名“setup.exe”,我知道如何找到它的句柄和DWORD进程id。我知道它确实有一个窗口,但我似乎不知道如何将此窗口带到前台,这就是我试图做的:使用其进程名将窗口带到前台。 在互联网上阅读后,我想到了以下算法,我也不确定这是正确的方法: 从进程名称中查找进程ID 使用枚举属于此进程ID的所有窗口 上述步骤将为我提供类型为-HWND的窗口句柄变量 我可以通过传入这个HWND变量来设置焦点或设置前景 我这里的问题是语法方面的,我真的不知道如何开始编写enumw

我有一个在Windows上运行的进程名“setup.exe”,我知道如何找到它的句柄和DWORD进程id。我知道它确实有一个窗口,但我似乎不知道如何将此窗口带到前台,这就是我试图做的:使用其进程名将窗口带到前台。

在互联网上阅读后,我想到了以下算法,我也不确定这是正确的方法:

  • 从进程名称中查找进程ID
  • 使用枚举属于此进程ID的所有窗口
  • 上述步骤将为我提供类型为-HWND的窗口句柄变量
  • 我可以通过传入这个HWND变量来设置焦点或设置前景
  • 我这里的问题是语法方面的,我真的不知道如何开始编写enumwindows,有人能告诉我一组示例代码吗,或者如果你有任何指向我应该如何处理这个问题的指针吗


    谢谢。

    EnumWindows过程评估所有顶级窗口。如果确定要查找的窗口是顶级窗口,则可以使用以下代码:

    #include <windows.h>
    
    // This gets called by winapi for every window on the desktop
    BOOL CALLBACK EnumWindowsProc(HWND windowHandle, LPARAM lParam)  {
        DWORD searchedProcessId = (DWORD)lParam;  // This is the process ID we search for (passed from BringToForeground as lParam)
        DWORD windowProcessId = 0;
        GetWindowThreadProcessId(windowHandle, &windowProcessId); // Get process ID of the window we just found
        if (searchedProcessId == windowProcessId)  {  // Is it the process we care about?
          SetForegroundWindow(windowHandle);  // Set the found window to foreground
          return FALSE;  // Stop enumerating windows
        }
        return TRUE;  // Continue enumerating
    }
    
    void BringToForeground(DWORD processId)  {
       EnumWindows(&EnumWindowsProc, (LPARAM)processId);
    }
    
    #包括
    //winapi会为桌面上的每个窗口调用此函数
    BOOL回调EnumWindowsProc(HWND windowHandle,LPARAM LPARAM){
    DWORD searchedProcessId=(DWORD)lParam;//这是我们搜索的进程ID(从BringtofReground传递为lParam)
    DWORD windowProcessId=0;
    GetWindowThreadProcessId(windowHandle,&windowProcessId);//获取我们刚刚找到的窗口的进程ID
    如果(searchedProcessId==windowProcessId){//这是我们关心的进程吗?
    SetForegroundWindow(windowHandle);//将找到的窗口设置为前台
    返回FALSE;//停止枚举窗口
    }
    返回TRUE;//继续枚举
    }
    void bringtofoground(DWORD processId){
    EnumWindows(&EnumWindowsProc,(LPRAM)进程ID);
    }
    
    然后用您想要的进程ID调用
    bringtofogreground


    免责声明:未测试,但应能正常工作:)

    您可以自己搜索示例代码。您已经知道API的名称了。试着自己写些东西,问一个具体的问题。就目前情况而言,这太宽泛了。这里有数百万关于堆栈溢出的EnumWindows问题。请看右侧的列表。当然,您需要是当前的前台进程才能调用SetForeGroundIndow。谢谢,我尝试了此代码,但一直收到:错误C2065:“EnumWindowsProc”:未声明的标识符。我试图在头文件中将其声明为静态bool回调,但仍然没有成功。我将继续尝试,同时等待您对此的反馈,如果您有任何…谢谢您Dark_Charlie,我在头文件中声明了回调函数。我现在就知道了,我缺少的是回调函数作为变量的声明。
    SetWindowPos(windowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE);  // it will bring window at the most front but makes it Always On Top.
    
    SetWindowPos(windowHandle, HWND_NOTOPMOST, 0, 0, 0,    0, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE); // just after above call, disable Always on Top.