HomeBlogMagic

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));
  }
}
Permalink: https://adirmeier.de/Blog/ID_440
Tags: Blog, C/C++, Windowsvon am 2023-01-03