How to get process name and title of the top window on Windows / C#

前端 未结 4 563
故里飘歌
故里飘歌 2020-12-31 14:44

As in the topic... or better - how to get this information from events when the top window changes?

4条回答
  •  醉酒成梦
    2020-12-31 15:14

    Thanks for hints. So I should use P/Invoke anyhow. Here is the complete code:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    
    namespace CuckooCoach
    {
        class Monitor
        {
            [DllImport("user32.dll")]
            private static extern IntPtr GetForegroundWindow();
    
            [DllImport("user32.dll")]
            static extern int GetWindowTextLength(IntPtr hWnd);
    
            //  int GetWindowText(
            //      __in   HWND hWnd,
            //      __out  LPTSTR lpString,
            //      __in   int nMaxCount
            //  );
            [DllImport("user32.dll")]
            private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
    
            //  DWORD GetWindowThreadProcessId(
            //      __in   HWND hWnd,
            //      __out  LPDWORD lpdwProcessId
            //  );
            [DllImport("user32.dll")]
            private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
    
            //HANDLE WINAPI OpenProcess(
            //  __in  DWORD dwDesiredAccess,
            //  __in  BOOL bInheritHandle,
            //  __in  DWORD dwProcessId
            //);
            [DllImport("kernel32.dll")]
            private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
    
            [DllImport("kernel32.dll")]
            private static extern bool CloseHandle(IntPtr handle);
    
            //  DWORD WINAPI GetModuleBaseName(
            //      __in      HANDLE hProcess,
            //      __in_opt  HMODULE hModule,
            //      __out     LPTSTR lpBaseName,
            //      __in      DWORD nSize
            //  );
            [DllImport("psapi.dll")]
            private static extern uint GetModuleBaseName(IntPtr hWnd, IntPtr hModule, StringBuilder lpFileName, int nSize);
    
            //  DWORD WINAPI GetModuleFileNameEx(
            //      __in      HANDLE hProcess,
            //      __in_opt  HMODULE hModule,
            //      __out     LPTSTR lpFilename,
            //      __in      DWORD nSize
            //  );
            [DllImport("psapi.dll")]
            private static extern uint GetModuleFileNameEx(IntPtr hWnd, IntPtr hModule, StringBuilder lpFileName, int nSize);
    
            public static string GetTopWindowText()
            {
                IntPtr hWnd = GetForegroundWindow();
                int length = GetWindowTextLength(hWnd);
                StringBuilder text = new StringBuilder(length + 1);
                GetWindowText(hWnd, text, text.Capacity);
                return text.ToString();
            }
    
            public static string GetTopWindowName()
            {
                IntPtr hWnd = GetForegroundWindow();
                uint lpdwProcessId;
                GetWindowThreadProcessId(hWnd, out lpdwProcessId);
    
                IntPtr hProcess = OpenProcess(0x0410, false, lpdwProcessId);
    
                StringBuilder text = new StringBuilder(1000);
                //GetModuleBaseName(hProcess, IntPtr.Zero, text, text.Capacity);
                GetModuleFileNameEx(hProcess, IntPtr.Zero, text, text.Capacity);
    
                CloseHandle(hProcess); 
    
                return text.ToString();
            }
    
        }
    }
    

提交回复
热议问题