Bring til front vindue ved hjælp af procesnavn i C ++

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg er en nybegynder i C ++ (altid været en C #), og jeg blev sat i for at troublshooting/opdatering af vores arvsprogram skrevet i C ++.


Jeg har et procesnavn 'setup.exe', der kører på vinduet, og jeg vidste, hvordan man finder HANDLE og DWORD proces id. Jeg ved, at det har et vindue sikkert, men jeg kan ikke finde ud af, hvordan man bringer dette vindue til forgrunden, og det er det jeg forsøger at gøre: At bringe et vindue til forgrunden ved hjælp af dets procesnavn.


Ved læsning på internettet kom jeg til følgende algoritme, som jeg heller ikke er sikker på, er den rigtige måde at gøre det på:



  1. Find proces-id'et fra procesnavnet.

  2. Tæl alle vinduer, der tilhører dette proces ID ved hjælp af EnumWindows

  3. Ovenstående trin vil give mig vindueshåndtaget (er) variabel af type - HWND

  4. Jeg kan indstille fokus eller sætte forgrunden ved at passere i denne HWND-variabel.



Mit problem her er syntax klogt, jeg ved ikke rigtig, hvordan man begynder at skrive enumwindows, kan nogen pege på et sæt prøvekode eller hvis du har en pointer til, hvordan jeg bør henvende mig til dette problem? [4]


Tak skal du have.

Bedste reference


EnumWindows-proceduren evaluerer alle vinduer på øverste niveau. Hvis du er sikker på, at vinduet du leder efter er øverste niveau, kan du bruge denne kode:


#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);
}


Ring derefter kun BringToForeground med det proces-id, du vil have.


DISCLAIMER: ikke testet, men skal fungere :)

Andre referencer 1


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.