2015-11-23 7 views
0

У меня есть конкретное приложение, которое я могу найти с помощьюПолучить процессы или нити идентификатор глобального нажатия клавиши с помощью SetWindowsHookEx

Process.GetProcesses() 

и фильтрацию ProcessName. Я хотел бы отфильтровать все события нажатия клавиш этого процесса, к сожалению, в качестве последнего параметра можно передать только необязательный идентификатор потока в SetWindowsHookEx.

Вот почему я подумал о фильтрации входящих событий, но я не могу найти способ получить информацию, откуда он пришел. Есть ли решение для этого?

Обратный вызов-информация предоставляется в пределах LowLevelKeyboardProc иметь другую внутри-структуру LPARAM: KBDLLHOOKSTRUCT

+1

На клавиши подходит к окну на переднем плане. Поэтому вам нужны GetForegroundWindow() и GetWindowThreadProcessId(). –

+0

@ Hans Passant: Это было полезно. Пожалуйста, отправьте ответ, чтобы я мог отметить это как решение. 'Process process = Process.GetProcesses() . Где (x => x.ProcessName ==" MyProcessName ") .FirstOrDefault(); // ... Ручка IntPtr = GetForegroundWindow(); uint processID = GetWindowThreadProcessId (дескриптор, IntPtr.Zero); if (p2.Threads.OfType (). Любой (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; 
    }