C# 检测击键并发送到后台窗口

Dpa*_*841 4 c# windows background keystrokes

今天我花了六个小时寻找一种方法来完成我想要完成的任务。然而,不幸的是,我尝试过的每一种方法都不起作用。

所以我正在开发的程序是视频游戏的多盒应用程序。本质上我想让我创建的应用程序在后台运行。用户将选中复选框以说明他们想要捕获哪些键,因此并非每个键都被捕获。然后,当他们玩主游戏时,应用程序会将检查到的密钥发送到后台运行的游戏。

我尝试过全局热键,但始终无法让多个按键同时工作。我也尝试过挂钩键,但由于某种原因,无法实现该功能。我也涉足了 sendmessage,但运气不佳。

只是好奇是否其他人有一些这样做的想法。举一个做同样事情的另一个程序的例子,比如 HotKeyNet、KeyClone 和 ISboxer。我知道还有更多,但这可以让您了解我正在尝试对我的应用程序做什么。

Dpa*_*841 5

好吧,在对发送击键和读取击键的不同方法进行了大量研究之后。我终于能够将不同类型的编码拼接在一起以提供我正在寻找的结果。

我将答案发布出来,以便以后寻找此问题答案的任何人都可以找到答案。

我将此代码拼接在一起的两个参考如下: http://www.codeproject.com/Articles/19004/A-Simple-C-Global-Low-Level-Keyboard-Hook

将击键组合发送到后台窗口

我使用全局低级挂钩和 postmessage 将击键发送到后台应用程序。

  1. 因此,首先您需要按照第一个链接中的说明进行操作,以使起始代码正常工作。

  2. 从链接一下载工作源代码,并在您的应用程序中使用 globalKeyboardHook.cs。

  3. 然后在参考文献中放置以下内容:

使用 System.Runtime.InteropServices;//获取你的DLL

使用实用程序;//从您添加到应用程序的文件中获取。

  1. 现在您需要将以下代码放入您的类中:

globalKeyboardHook gkh = new globalKeyboardHook();

[DllImport("user32.dll")] //用于将击键发送到新窗口。

公共静态 extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Ansi)] //用于查找要向其发送击键的窗口。

公共静态 extern IntPtr FindWindow(string className, string windowName);

  1. 现在继续放置您想要抓取的击键,我发现在 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 += new KeyEventHandler(gkh_KeyDown); //按下按键的事件。

gkh.KeyUp += new KeyEventHandler(gkh_KeyUp); //释放按键的事件。

  1. 之后,您还需要将以下内容放入代码中:

void gkh_KeyUp(object sender, KeyEventArgs e) //按键释放时会发生什么。

{

lstLog.Items.Add("Up\t" + e.KeyCode.ToString());

e.已处理=假;//将此设置为 true 将导致全局热键阻止所有传出击键。

}

void gkh_KeyDown(object sender, KeyEventArgs e) //按下按键时会发生什么。

{

lstLog.Items.Add("Down\t" + e.KeyCode.ToString());

e.已处理=假;

}

  1. 一旦到位,只需将这一点放入 gkh_KeyDown 即可将您的击键发送到您选择的另一个窗口:

常量 uint WM_KEYDOWN = 0x100;

IntPtr hWnd = FindWindow(null, "示例1"); //查找应用程序的窗口Example1。

开关(e.KeyCode)

{

case Keys.A: //使其仅在按下时发送该键而不发送其他键。

if(chkA.Checked == true)

{

PostMessage(hWnd, WM_KEYDOWN, (IntPtr)(Keys.A), IntPtr.Zero); //将键A发送到分配了hWnd的新窗口,该窗口等于Example1。

}

休息;

}

}

我提供的代码经过设置,以便人们可以使用复选框来告诉程序他们想要将哪些密钥发送到第二个应用程序。

如果您对这篇文章有任何疑问,请告诉我,我将尽力引导您完成整个过程。希望这可以帮助以后的人。