Windows - Anderen Prozess in Vordergrund schieben und aktivieren per CLI
Für ein kleine Projekt musste ich ein Window Prozess in den Vordergrund holen und für Eingaben aktivieren. das habe ich mit einem kleinen Konsolen Programm gelöst:
#include <windows.h>
#include <iostream>
#include <stdio.h>
char* g_pSearchWindow = nullptr;
HWND g_pIgnoreWindow = nullptr;
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
if (g_pSearchWindow &&
g_pIgnoreWindow != hWnd)
{
char buffer[128];
int written = GetWindowTextA(hWnd, buffer, 128);
if (written && strstr(buffer, g_pSearchWindow) != NULL)
{
// Get target process
DWORD dwTargetProcessId;
DWORD dwTargetThreadId = GetWindowThreadProcessId(hWnd, &dwTargetProcessId);
printf("dwTargetProcessId %d\n", dwTargetProcessId);
printf("dwTargetThreadId %d\n", dwTargetThreadId);
// Get current process
DWORD dwMyThreadId = GetCurrentThreadId();
printf("dwMyThreadId %d\n", dwMyThreadId);
DWORD dwMyProcessId = GetCurrentProcessId();
printf("dwMyProcessId %d\n", dwMyProcessId);
if (
dwMyProcessId != dwTargetProcessId &&
::AttachThreadInput(dwMyThreadId, dwTargetThreadId, TRUE)
)
{
printf("Found Window %s\n", buffer);
printf("Attach done\n");
// Put it to foreground and activate
SetForegroundWindow(hWnd);
SetActiveWindow(hWnd);
// Distach
::AttachThreadInput(dwMyThreadId, dwTargetThreadId, FALSE);
printf("Window activated");
return FALSE;
}
}
}
return TRUE;
}
int main(int iArgc, char** pArgv)
{
if (iArgc > 1)
{
HWND hWnd = NULL;
g_pSearchWindow = pArgv[1];
g_pIgnoreWindow = GetConsoleWindow();
EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(&hWnd));
}
}