3

今天我已经环顾了六个小时,以寻找一种方法来完成我想要完成的任务。但是,运气不佳,我尝试过的每种方法都不起作用。

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

我已经尝试过全局热键,但是永远无法使多个键起作用。我也尝试过挂钩键,但由于某种原因,无法获得该功能。我也涉足了 sendmessage 也没有什么运气。

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

4

2 回答 2

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")] //用于将击键发送到新窗口。

公共静态外部 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);

  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 += 新 KeyEventHandler(gkh_KeyDown); //按下按键的事件。

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

  1. 之后,您还需要继续在代码中添加以下内容:

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;

}

  1. 一旦到位,只需将这一点放在 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的新窗口。

}

休息;

}

}

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

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

于 2016-10-22T04:06:18.657 回答
0

我的建议是使用“映射内存”(在操作系统概念中:共享内存)

第一个进程创建(可能是您的检查状态程序)创建映射内存并将值写入其中。

所有其他游戏进程从第一个进程创建的内存映射中读取值。

这是一个关于如何做的非常好的例子。

https://msdn.microsoft.com/en-us/library/dd267552(v=vs.110).aspx

于 2016-10-21T04:18:33.810 回答