好吧,在对发送击键和读取击键的不同方法进行了大量研究之后。我终于能够将不同类型的编码拼接在一起,以提供我正在寻找的结果。
我正在发布答案,所以以后任何正在寻找这个问题的答案的人都可以使用它。
我将这段代码拼接在一起的两个参考如下:
http: //www.codeproject.com/Articles/19004/A-Simple-C-Global-Low-Level-Keyboard-Hook
将击键组合发送到后台窗口
我使用全局低级挂钩和 postmessage 将击键发送到后台应用程序。
因此,首先您需要按照第一个链接中的说明操作,以使起始代码正常工作。
从链接一下载工作源代码,并在您的应用程序中使用 globalKeyboardHook.cs。
然后在参考文献中放置以下内容:
使用 System.Runtime.InteropServices;//抓取你的DLL
使用实用程序;//从您添加到应用程序的文件中获取。
- 现在您需要在您的类中放置以下代码:
globalKeyboardHook gkh = new globalKeyboardHook();
[DllImport("user32.dll")] //用于将击键发送到新窗口。
公共静态外部 IntPtr PostMessage(IntPtr hWnd,uint Msg,IntPtr wParam,IntPtr lParam);
[DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Ansi)] //用于查找要发送击键的窗口。
public static extern IntPtr FindWindow(string className, string windowName);
- 现在继续放置您想要抓取的击键,我发现在 Form1_Loaded 中最好:
gkh.HookedKeys.Add(Keys.A);//这里收集A Key。
gkh.HookedKeys.Add(Keys.B);//这里收集B Key。
gkh.HookedKeys.Add(Keys.C);//这个收集C Key。
gkh.KeyDown += 新 KeyEventHandler(gkh_KeyDown); //按下按键的事件。
gkh.KeyUp += 新 KeyEventHandler(gkh_KeyUp); //释放键的事件。
- 之后,您还需要继续在代码中添加以下内容:
void gkh_KeyUp(object sender, KeyEventArgs e) //按键释放时会发生什么。
{
lstLog.Items.Add("Up\t" + e.KeyCode.ToString());
e.Handled = false; //将此设置为true将导致全局热键阻止所有传出击键。
}
void gkh_KeyDown(object sender, KeyEventArgs e) //按键时会发生什么。
{
lstLog.Items.Add("Down\t" + e.KeyCode.ToString());
e.Handled = false;
}
- 一旦到位,只需将这一点放在 gkh_KeyDown 中,即可将您的击键发送到您选择的另一个窗口:
常量 uint WM_KEYDOWN = 0x100;
IntPtr hWnd = FindWindow(null, "Example1"); //找到应用程序的窗口Example1。
开关(e.KeyCode)
{
case Keys.A: //使它只在按下时发送该键,而不发送其他键。
如果(chkA.Checked == true)
{
PostMessage(hWnd, WM_KEYDOWN, (IntPtr)(Keys.A), IntPtr.Zero); //发送到键A到分配hWnd等于Example1的新窗口。
}
休息;
}
}
我提供的代码是设置的,因此人们可以使用复选框来告诉程序他们想要将哪些键发送到第二个应用程序。
如果您对这篇文章有任何疑问,请告诉我,我会尽力引导您完成整个过程。希望这对以后的人有所帮助。