2008-09-18 61 views

回答

9

我假设你想获得拥有当前焦点窗口的进程的名称。对于一些的P/Invoke:

// The GetForegroundWindow function returns a handle to the foreground window 
// (the window with which the user is currently working). 
[System.Runtime.InteropServices.DllImport("user32.dll")] 
private static extern IntPtr GetForegroundWindow(); 

// The GetWindowThreadProcessId function retrieves the identifier of the thread 
// that created the specified window and, optionally, the identifier of the 
// process that created the window. 
[System.Runtime.InteropServices.DllImport("user32.dll")] 
private static extern Int32 GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); 

// Returns the name of the process owning the foreground window. 
private string GetForegroundProcessName() 
{ 
    IntPtr hwnd = GetForegroundWindow(); 

    // The foreground window can be NULL in certain circumstances, 
    // such as when a window is losing activation. 
    if (hwnd == null) 
     return "Unknown"; 

    uint pid; 
    GetWindowThreadProcessId(hwnd, out pid); 

    foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses()) 
    { 
     if (p.Id == pid) 
      return p.ProcessName; 
    } 

    return "Unknown"; 
} 
+0

当前景窗口更改时,我可以收到事件通知吗? – manishKungwani 2011-07-13 10:30:49

+0

@manishKungwani:你应该问这是一个新问题。 – 2011-07-13 11:16:54

0
using System; 
using System.Windows; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace FGHook 
{ 
    class ForegroundTracker 
    { 
     // Delegate and imports from pinvoke.net: 

     delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType, 
      IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime); 

     [DllImport("user32.dll")] 
     static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax, IntPtr 
      hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess, 
      uint idThread, uint dwFlags); 

     [DllImport("user32.dll")] 
     static extern IntPtr GetForegroundWindow(); 

     [DllImport("user32.dll")] 
     static extern Int32 GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); 


     [DllImport("user32.dll")] 
     static extern bool UnhookWinEvent(IntPtr hWinEventHook); 



     // Constants from winuser.h 
     const uint EVENT_SYSTEM_FOREGROUND = 3; 
     const uint WINEVENT_OUTOFCONTEXT = 0; 

     // Need to ensure delegate is not collected while we're using it, 
     // storing it in a class field is simplest way to do this. 
     static WinEventDelegate procDelegate = new WinEventDelegate(WinEventProc); 

     public static void Main() 
     { 
      // Listen for foreground changes across all processes/threads on current desktop... 
      IntPtr hhook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, 
        procDelegate, 0, 0, WINEVENT_OUTOFCONTEXT); 

      // MessageBox provides the necessary mesage loop that SetWinEventHook requires. 
      MessageBox.Show("Tracking focus, close message box to exit."); 

      UnhookWinEvent(hhook); 
     } 

     static void WinEventProc(IntPtr hWinEventHook, uint eventType, 
      IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) 
     { 
      Console.WriteLine("Foreground changed to {0:x8}", hwnd.ToInt32()); 
      //Console.WriteLine("ObjectID changed to {0:x8}", idObject); 
      //Console.WriteLine("ChildID changed to {0:x8}", idChild); 
      GetForegroundProcessName(); 

     } 
     static void GetForegroundProcessName() 
     { 
      IntPtr hwnd = GetForegroundWindow(); 

      // The foreground window can be NULL in certain circumstances, 
      // such as when a window is losing activation. 
      if (hwnd == null) 
       return; 

      uint pid; 
      GetWindowThreadProcessId(hwnd, out pid); 

      foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses()) 
      { 
       if (p.Id == pid) 
       { 
        Console.WriteLine("Pid is: {0}",pid); 
        Console.WriteLine("Process name is {0}",p.ProcessName); 
        return; 
       } 
       //return; 
      } 

      Console.WriteLine("Unknown"); 
     } 
    } 
} 
相关问题