将击键组合发送到背景窗口

时间:2012-10-09 17:34:43

标签: c# hook

经过对Stackoverflow和google的大量研究后,似乎很难使用它的句柄将击键组合发送到后台窗口。例如,我想发送CTRL + F.似乎Sendmessage不起作用,并且sendinput无效,因为窗口需要焦点。

所以我最后的想法是关于挂钩:无论如何使用这种方式发送组合?

2 个答案:

答案 0 :(得分:7)

好的,我找到了一种解决方法,但它并不适用于所有应用程序。否则,它适用于puTTY,我想用键击组合控制的程序。即使应用程序没有集中,它也能工作。所以我现在完成了!

class SendMessage
{
[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

public static void sendKeystroke()
{
    const uint WM_KEYDOWN = 0x100;
    const uint WM_KEYUP = 0x0101;

    IntPtr hWnd;
    string processName = "putty";
    Process[] processList = Process.GetProcesses();

    foreach (Process P in processList)
    {
        if (P.ProcessName.Equals(processName))
        {
            IntPtr edit = P.MainWindowHandle;
            PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.Control), IntPtr.Zero);
            PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.A), IntPtr.Zero);
            PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.Control), IntPtr.Zero);
        }
    }                           
}

}

答案 1 :(得分:5)

我编写了几个向后台窗口发送按键的程序,我通常实现了PostMessage / SendMessage。我记录了我的所有发现here

但您基本上会使用低级别的c调用将消息放入Windows消息队列,以允许应用程序接收按键。

PostMessage

SendMessage

如果您有任何疑问,请告诉我,我的图书馆是用C#编写的,我很乐意与您分享。此方法还允许在后台窗口中使用鼠标:)

所有代码都已签入GitHub:https://github.com/EasyAsABC123/Keyboard