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

C#检测击键并发送到后台窗口,c#,windows,background,keystrokes,C#,Windows,Background,Keystrokes,今天我已经四处寻找了六个小时,寻找一种方法来完成我想要完成的任务。然而,由于运气不佳,我尝试过的每一种方法都不起作用 所以我正在开发的程序是一个用于视频游戏的多拳击应用程序。基本上,我想让我创建的应用程序在后台运行。用户将选中复选框以说明要捕获哪些密钥,因此并非每个密钥都被捕获。然后,当他们玩主游戏时,应用程序会将检查过的密钥发送到后台运行的游戏 我尝试过全局热键,但从来没有一个以上的关键工作。我也尝试过钩键,但由于某种原因,无法实现功能。我也涉猎了sendmessage,但也没什么运气 我只是

今天我已经四处寻找了六个小时,寻找一种方法来完成我想要完成的任务。然而,由于运气不佳,我尝试过的每一种方法都不起作用

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

我尝试过全局热键,但从来没有一个以上的关键工作。我也尝试过钩键,但由于某种原因,无法实现功能。我也涉猎了sendmessage,但也没什么运气


我只是好奇是否还有其他人有这样做的想法。举一个例子,另一个做同样事情的程序是HotKeyNet、KeyClone和ISboxer。我知道还有更多,但这让你知道我在用我的应用程序做什么

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

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

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

这里有一个关于如何做的很好的例子


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

我正在公布答案,所以任何人在以后寻找这个问题的答案都可以找到

我将此代码拼接在一起的两个参考资料如下:

我使用全局低级hook和postmessage向后台应用程序发送击键

  • 因此,首先,您需要按照第一部分的说明进行操作 链接,以使起始代码正常工作

  • 从linkone下载工作源代码,并使用 应用程序中的globalKeyboardHook.cs

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

  • 使用System.Runtime.InteropServices//抓取您的DLL

    使用公用设施//从添加到应用程序的文件中获取

  • 现在,您需要在类中放置以下代码:
  • globalKeyboardHook gkh=新的globalKeyboardHook()

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

    公共静态外部IntPtr PostMessage(IntPtr hWnd、uint Msg、IntPtr wParam、IntPtr lParam)

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

    公共静态外部IntPtr FindWindow(字符串类名称、字符串窗口名称)

  • 现在开始吧,把你想被抓住的按键放在这里 找到最好的格式1\u加载:
  • gkh.HookedKeys.Add(键A)//这收集了一把钥匙

    gkh.HookedKeys.Add(图例B)//这将收集B键

    gkh.HookedKeys.Add(图例C)//这将收集C键

    gkh.KeyDown+=新的KeyEventHandler(gkh_KeyDown)//事件,用于向下按键

    gkh.KeyUp+=新的KeyEventHandler(gkh_KeyUp)//用于释放密钥的事件

  • 之后,您将希望继续并在下面的 您的代码也是:
  • void gkh_KeyUp(对象发送方,KeyEventArgs e)//释放密钥时会发生什么

    {

    lstLog.Items.Add(“Up\t”+e.KeyCode.ToString())

    e、 Handled=false;//将此设置为true将导致全局热键阻止所有传出的击键

    }

    void gkh_KeyDown(对象发送器,KeyEventArgs e)//按键时发生的情况

    {

    lstLog.Items.Add(“Down\t”+e.KeyCode.ToString())

    e、 已处理=错误

    }

  • 一旦这是到位,只要把这一点在gkh_键下降到 让您的按键发送到您选择的另一个窗口:
  • 常数WM_KEYDOWN=0x100

    IntPtr hWnd=FindWindow(null,“示例1”)//查找应用程序的窗口示例1

    开关(如钥匙代码)

    {

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

    如果(chkA.Checked==true)

    {

    PostMessage(hWnd,WM_KEYDOWN,(IntPtr)(Keys.A),IntPtr.Zero);//向键A发送一个新的窗口,该窗口分配的hWnd等于Example1

    }

    中断

    }

    }

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


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

    基本上,您希望在两个正在运行的进程之间进行通信。基本上是的,目前我已经设置了它,因此它将两个正在运行的进程都命名为Example1和Example2。我想当有人在玩示例1时,我的应用程序会在他们按下键时抓取他们要抓取的键,并将它们发送到后台进程示例2,所以它也可以在这个过程中执行击键。我唯一的问题是这种方法会写入内存,我知道一些游戏,比如魔兽世界。使用软件检测内存注入,并永久禁止使用该软件的帐户。我不想成为某人在这方面被禁止的原因。我知道他们允许多重装箱,但我不知道他们是否允许通过内存注入