当任何正在运行的控制台进程具有键盘焦点时,我的目标是捕获Ctrl + Shift + 键序列(其中键将由我的应用程序定义)。 然后在这样的关键中风,我需要插入一些特定的文本到该控制台的应用程序。
在Hookfilter函数中过滤Windows消息
KeyboardProc返回TRUE会导致性能下降
git:在任何客户端推送后,在服务器上自动运行bash脚本
如何获得窗口蝙蝠整个svn提交信息?
C#钩入Windows资源pipe理器文件夹更改事件
我希望我的测试dll将被注入并在当时正在接收键盘输入的过程中调用,但不幸的是,它不是。 它总是从我自己的进程中调用SetwindowsHookEx()来安装钩子。
这个警告在文档中有明确的说明:
KeyboardProc
这个钩子可以在安装它的线程的上下文中调用。 这个调用是通过向安装钩子的线程发送消息来完成的。 因此,安装钩子的线程必须有一个消息循环。
LowLevelKeyboardProc
这个钩子在安装它的线程的上下文中被调用。 这个调用是通过向安装钩子的线程发送消息来完成的。 因此,安装钩子的线程必须有一个消息循环。
而且由于这两个钩子都不能给你提供进程信息,所以它们不会帮助你知道哪个进程将会收到按键。 在这些钩子中可以做的最接近的是使用GetForegroundWindow()和GetwindowThreadProcessId() ,但是这并不能保证你确定的进程ID将是实际接收键盘输入的进程ID。
然后,我的想法是安装WH_CBT全局钩子,并在nCode == HCBT_SETFOCUS时捕获实例,以便任何窗口接收键盘焦点。 然后,我将需要确定该窗口属于HWND的控制台应用程序。 然后使用Dll Insjection方法在其进程中运行我的代码
给定一个HWND,你可以使用GetwindowThreadProcessId()来确定它的线程ID和进程ID,并通过调用GetClassName()来判断它是否是一个控制台窗口,看看它是否是"ConsoleWindowClass" 。
但是,这只会告诉你,窗口本身是否是一个控制台窗口。 它不会告诉你哪个进程当前正在该窗口中显示一个UI。 有可能:
cmd.exe本身(或在%COMSPEC%环境变量中指定的任何命令处理器)。
一个由cmd.exe启动的控制台应用程序,因此与属于cmd.exe的控制台窗口交互。
一个直接启动的控制台应用程序,因此具有由操作系统为其创建的专用控制台窗口。
一个非控制台进程,通过AllocConsole()创建自己的控制台窗口。
一个非控制台进程,通过AttachConsole()与另一个进程的控制台窗口关联。
不过,我想这并不重要。 如果控制台窗口属于cmd.exe ,它将首先接收按键,然后将其委托给窗口中当前显示的任何子进程。 如果它是专门用于另一个进程的控制台,则该进程将直接接收击键。 所以,无论哪种方式,你都应该能够挂接实际创建控制台HWND的进程ID,因为这应该是第一个可以看到击键的进程。
我所遇到的问题是一旦注入到目标控制台进程中,我如何拦截键盘按键?
你仍然可以像以前一样使用键盘钩子。 您可以创建一个与特定线程ID相关联的键盘钩子,因此使用创建控制台窗口的线程ID,因为这是唯一可以直接与窗口交互并可以接收输入消息的线程。 只要确保你安装键盘钩子的线程有一个消息循环。 无论您将该线程远程注入控制台进程,还是将其保留在自己的进程中,这都取决于您。 您应该能够以任何方式接收键盘事件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。