C#/Console
[C#] 윈도우 프로시저 탐색 및 포커싱 된 프로세스 접근하기
스타크래프트 좋아하는 사람
2022. 3. 1. 18:56
using System;
using System.Diagnostics; //Process
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
Process[] process = Process.GetProcesses();
for (int i = 0; i < process.Length; ++i)
{
Console.WriteLine(process[i].Id + " " + process[i].ProcessName);
}
}
}
}
위의 코드로 현재 내 컴퓨터에서 실행 중인 모든 프로세스 정보를 볼 수 있습니다.
그리고 현재 포커싱 되어있는 프로세스에 접근하기 위해선 윈도우 API가 필요합니다.
C:\Windows\System32\user32.dll (dynamic link library) 요기에 있는 함수
IntPtr GetForegroundWindow() : 현재 맨 앞의 윈도우 핸들(hWnd) 가져오기 (최상위 프로세스)
int GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId) : 핸들을 이용하여 프로세스 아이디 가져오기
2개가 필요합니다.
실행 시켜준 후 다른 프로세스로(실행 중인 프로그램) 포커스를 옮겨보았습니다.
using System;
using System.Diagnostics; //Process
using System.Runtime.InteropServices; //DLL Import
using System.Threading; //Thread
namespace ConsoleApp
{
class Program
{
[DllImport("user32.dll")]
public static extern int GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
private static void CheckCurrentProcess ()
{
for (int i = 0; i < 5; ++i)
{
IntPtr hWnd = GetForegroundWindow(); //맨 앞의 프로그램 핸들 반환
uint processId;
GetWindowThreadProcessId(hWnd, out processId); //해당 프로세스 id 반환
Process currentProcess = Process.GetProcessById((int)processId);
Console.WriteLine(currentProcess.Id + " " + currentProcess.ProcessName);
Thread.Sleep(3000); //3초
}
}
static void Main(string[] args)
{
Thread thread = new Thread(CheckCurrentProcess);
thread.Start();
thread.Join();
}
}
}
결과 화면
저는 개인용 캡쳐 프로그램을 만들기 위해 해당 기능들을 사용할 생각입니다.
찾아보면 윈도우 API 기능들이 유용한 것들이 많이 있네요!