2013-06-21 78 views
0

我在最近兩天內遇到了一個問題,我想要獲取他點擊的用戶進程。就像用戶點擊記事本一樣,我的程序應該告訴我用戶點擊記事本。記事本已打開。如果用戶點擊計算器,我的程序也會告訴用戶點擊計算器。 Calcultor進程正在運行。如何使用Intptr(USER32.dll)從鼠標事件獲取進程???

爲此,我使用了這段代碼。鉤經理給我鼠標點擊事件,但沒有給我的過程。

我只得到鼠標intptr事件。

private static void WindowEventCallback(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) 
{ 
    Console.WriteLine("Event {0}", hwnd);// it is giving me mouse event 
    /*uint pid; 
    GetWindowThreadProcessId(hwnd, out pid);// it gives me process id 
    Process p = Process.GetProcessById((int)pid);// now here exception occured not in vs studio but when i run its exe then its gives me access violation exception 
    if (!my.ContainsKey(p.MainWindowTitle.ToString())) 
    { 
      my.Add(p.MainWindowTitle.ToString(), p.Id.ToString()); 
      Console.WriteLine("\r\n"); 
      Console.WriteLine("Status = Running"); 
      Console.WriteLine("\r\n Window Title:" + p.MainWindowTitle.ToString()); 
      Console.WriteLine("\r\n Process Name:" + p.ProcessName.ToString()); 
      Console.WriteLine("\r\n Process Starting Time:" + p.StartTime.ToString()); 
    }*/ 
} 

完整的代碼是

static void Main(string[] args) 
    { 
     HookManager.SubscribeToWindowEvents(); 

     EventLoop.Run(); 
    } 


    public static class HookManager 
    { 
     [DllImport("user32.dll")] 
     public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, out uint ProcessId); 
     public static void SubscribeToWindowEvents() 
     { 
      if (windowEventHook == IntPtr.Zero) 
      { 
       windowEventHook = SetWinEventHook(
        EVENT_SYSTEM_FOREGROUND, // eventMin 
        EVENT_SYSTEM_FOREGROUND, // eventMax 
        IntPtr.Zero,    // hmodWinEventProc 
        WindowEventCallback,  // lpfnWinEventProc 
        0,      // idProcess 
        0,      // idThread 
        WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS); 

       if (windowEventHook == IntPtr.Zero) 
       { 
        throw new Win32Exception(Marshal.GetLastWin32Error()); 
       } 
      } 
     } 

     static Dictionary<string, string> my = new Dictionary<string, string>(); 


     private static void WindowEventCallback(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) 
     { 
      Console.WriteLine("Event {0}", hwnd); 
      /*uint pid; 
      GetWindowThreadProcessId(hwnd, out pid); 
      Process p = Process.GetProcessById((int)pid); 
      if (!my.ContainsKey(p.MainWindowTitle.ToString())) 
      { 
       my.Add(p.MainWindowTitle.ToString(), p.Id.ToString()); 
       Console.WriteLine("\r\n"); 
       Console.WriteLine("Status = Running"); 
       Console.WriteLine("\r\n Window Title:" + p.MainWindowTitle.ToString()); 
       Console.WriteLine("\r\n Process Name:" + p.ProcessName.ToString()); 
       Console.WriteLine("\r\n Process Starting Time:" + p.StartTime.ToString()); 


      }*/ 
     } 
    } 

    private static IntPtr windowEventHook; 

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

    [DllImport("user32.dll", SetLastError = true)] 
    private static extern IntPtr SetWinEventHook(int eventMin, int eventMax, IntPtr hmodWinEventProc, WinEventProc lpfnWinEventProc, int idProcess, int idThread, int dwflags); 
    [DllImport("user32.dll", SetLastError = true)] 
    private static extern int UnhookWinEvent(IntPtr hWinEventHook); 

    private const int WINEVENT_INCONTEXT = 4; 
    private const int WINEVENT_OUTOFCONTEXT = 0; 
    private const int WINEVENT_SKIPOWNPROCESS = 2; 
    private const int WINEVENT_SKIPOWNTHREAD = 1; 

    private const int EVENT_SYSTEM_FOREGROUND = 3; 


    public static class EventLoop 
    { 
     public static void Run() 
     { 
      MSG msg; 

      while (true) 
      { 

       if (PeekMessage(out msg, IntPtr.Zero, 0, 0, PM_REMOVE)) 
       { 
        if (msg.Message == WM_QUIT) 
         break; 

        TranslateMessage(ref msg); 
        DispatchMessage(ref msg); 
       } 
      } 
     } 

     [StructLayout(LayoutKind.Sequential)] 
     private struct MSG 
     { 
      public IntPtr Hwnd; 
      public uint Message; 
      public IntPtr WParam; 
      public IntPtr LParam; 
      public uint Time; 
     } 

     const uint PM_NOREMOVE = 0; 
     const uint PM_REMOVE = 1; 

     const uint WM_QUIT = 0x0012; 

     [DllImport("user32.dll")] 
     private static extern bool PeekMessage(out MSG lpMsg, IntPtr hwnd, uint wMsgFilterMin, uint wMsgFilterMax, uint wRemoveMsg); 
     [DllImport("user32.dll")] 
     private static extern bool TranslateMessage(ref MSG lpMsg); 
     [DllImport("user32.dll")] 
     private static extern IntPtr DispatchMessage(ref MSG lpMsg); 
    } 
} 
+0

我不知道你問的問題正確的問題。你確定你不是在尋找類似[UI Automation](http://msdn.microsoft.com/en-us/library/ms753388.aspx)系統的東西嗎? - 它是一個框架,可以讓您確定用戶與其他程序進行交互的方式,如果需要,還可以代表用戶執行輸入。儘管它是一個.NET解決方案,但它適用於所有可訪問的應用程序,無論是否管理。 –

回答

相關問題