使用SetWindowsHookEx检索全局按键的进程或线程ID

时间:2015-11-23 14:28:12

标签: c# setwindowshookex

我有一个特定的应用程序,我可以使用

找到
Process.GetProcesses()

并按ProcessName过滤。 我想过滤掉该过程的所有按键事件,遗憾的是,只能将可选的线程ID传递给SetWindowsHookEx作为最后一个参数。

这就是我考虑过滤传入事件的原因,但我找不到一种方法来检索它来自哪里的信息。有没有解决办法呢?

回调信息在LowLevelKeyboardProc内提供,在lparam中有另一个结构:KBDLLHOOKSTRUCT

1 个答案:

答案 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;
    }