2015-11-23 54 views
0

檢索全局按鍵的過程或線程ID我有一個特定的應用程序,我可以找到使用使用SetWindowsHookEx函數

Process.GetProcesses() 

和過濾通過ProcessName。 我想過濾掉該進程的所有按鍵事件,但不幸的是,只能將一個可選的線程ID作爲最後一個參數傳遞給SetWindowsHookEx

這就是爲什麼我想過濾傳入的事件,但我無法找到一種方式來檢索它來自哪裏的信息。有沒有解決方案?

回調信息被內LowLevelKeyboardProc提供具有內部LPARAM另一個結構:KBDLLHOOKSTRUCT

+1

擊鍵進入在前景中的窗口。所以你需要GetForegroundWindow()和GetWindowThreadProcessId()。 –

+0

@Hans Passant:這很有幫助。請發佈答案,以便我可以將此標記爲已解決。 'Process process = Process.GetProcesses() .Where(x => x.ProcessName ==「MyProcessName」) .FirstOrDefault(); // ... IntPtr handle = GetForegroundWindow(); uint processID = GetWindowThreadProcessId(handle,IntPtr.Zero); if(p2.Threads.OfType ()。Any(x => x.Id == Convert.ToInt32(processID))) // success' – isHuman

+0

只需自行發佈解決方案並將其標記爲答案。 –

回答

0
public partial class Form1 : Form 
{ 
    [DllImport("user32.dll")] 
    static extern IntPtr GetForegroundWindow(); 

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

    Process process; 

    public Form1() 
    { 
     process = Process.GetProcesses() 
      .Where(x => x.ProcessName == "MyProcessName") 
      .FirstOrDefault(); 

     //init global keypress as needed 
    } 

    void gkh_KeyUp(object sender, KeyEventArgs e) 
    { 
     IntPtr handle = GetForegroundWindow(); 
     uint processID = GetWindowThreadProcessId(handle, IntPtr.Zero); 
     if (p2.Threads.OfType<ProcessThread>().Any(x => x.Id == Convert.ToInt32(processID))) 
     { 
      //keypress in MyProcessName 
     } 
     e.Handled = true; 
    } 
相關問題