jjzjj

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

coder 2024-06-10 原文

今天我花了六个小时四处寻找方法来完成我想要完成的任务。然而,运气不佳,我尝试过的每一种方法都没有奏效。

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

我已经尝试过全局热键,但从来没有超过一个键起作用。我也尝试过连接键,但出于某种原因,无法实现该功能。我也涉足了 sendmessage,但运气不佳。

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

最佳答案

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

我正在张贴答案,以便以后寻找此问题答案的任何人都可以使用。

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

Send combination of keystrokes to background window

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

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

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

  3. 然后在引用中放置以下内容:

using System.Runtime.InteropServices; //Grabs for your DLLs

using Utilities; //Grabs from the file you added to your application.

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

globalKeyboardHook gkh = new globalKeyboardHook();

[DllImport("user32.dll")] //Used for sending keystrokes to new window.

public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Ansi)] //Used to find the window to send keystrokes to.

public static extern IntPtr FindWindow(string className, string windowName);

  1. 现在继续放置你想要被捕获的击键我 在 Form1_Loaded 中找到最好的:

gkh.HookedKeys.Add(Keys.A);//This collects the A Key.

gkh.HookedKeys.Add(Keys.B);//This collects the B Key.

gkh.HookedKeys.Add(Keys.C);//This collects the C Key.

gkh.KeyDown += new KeyEventHandler(gkh_KeyDown); //Event for pressing the key down.

gkh.KeyUp += new KeyEventHandler(gkh_KeyUp); //Event for the release of key.

  1. 之后,您将要继续并放置在以下位置 你的代码也是:

void gkh_KeyUp(object sender, KeyEventArgs e) //What happens on key release.

{

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

e.Handled = false; //Setting this to true will cause the global hotkeys to block all outgoing keystrokes.

}

void gkh_KeyDown(object sender, KeyEventArgs e) //What happens on key press.

{

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

e.Handled = false;

}

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

const uint WM_KEYDOWN = 0x100;

IntPtr hWnd = FindWindow(null, "Example1"); //Find window Example1 for application.

switch (e.KeyCode)

{

case Keys.A: //Makes it so it only sends that key when it's pressed and no other keys.

if(chkA.Checked == true)

{

PostMessage(hWnd, WM_KEYDOWN, (IntPtr)(Keys.A), IntPtr.Zero); //Sends to key A to new window assigned hWnd which equals Example1.

}

break;

}

}

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

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

关于C# 检测击键并发送到后台窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40168035/

有关C# 检测击键并发送到后台窗口的更多相关文章

  1. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  2. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  3. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  4. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  5. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  6. ruby - 如何在 ruby​​ 中运行后台线程? - 2

    我是ruby​​的新手,我认为重新构建一个我用C#编写的简单聊天程序是个好主意。我正在使用Ruby2.0.0MRI(Matz的Ruby实现)。问题是我想在服务器运行时为简单的服务器命令提供I/O。这是从示例中获取的服务器。我添加了使用gets()获取输入的命令方法。我希望此方法在后台作为线程运行,但该线程正在阻塞另一个线程。require'socket'#Getsocketsfromstdlibserver=TCPServer.open(2000)#Sockettolistenonport2000defcommandsx=1whilex==1exitProgram=gets.chomp

  7. ruby - (Ruby || Python) 窗口管理器 - 2

    我想用这两种语言中的任何一种(最好是ruby​​)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生

  8. ruby - 未定义的方法 auto_upgrade!将 Sinatra/DataMapper 应用程序推送到 Heroku 时 - 2

    有谁知道在Heroku的Bamboo堆栈上启动并运行使用DataMapper的Sinatra应用程序所需的魔法咒语?Bamboo堆栈不包含任何预安装的系统gem,无论我尝试使用何种gem组合,我都会不断收到此错误:undefinedmethod`auto_upgrade!'forDataMapper:Module(NoMethodError)这是我的.gems文件中的内容:sinatrapgdatamapperdo_postgresdm-postgres-adapter这些是我将应用程序推送到Heroku时安装的依赖项:----->Herokureceivingpush----->Si

  9. ruby-on-rails - 获取并发布相同匹配项的请求 - 2

    在我的路线文件中我有:match'graphs/(:id(/:action))'=>'graphs#(:action)'如果是GET请求(工作)或POST请求(不工作),我想匹配它我知道我可以使用以下方法在资源中声明POST请求:post'/'=>:show,:on=>:member但是我怎样才能为比赛做到这一点呢?谢谢。 最佳答案 如果你同时想要POST和GETmatch'graphs/(:id(/:action))'=>'graphs#(:action)',:via=>[:get,:post]编辑默认值可以设置如下match'g

  10. ruby - 检测由 RSpec、Ruby 运行的代码 - 2

    我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题

随机推荐