我想在Linux下交付,拦截并生成键盘(make/break)事件,然后才能将它们传送到任何应用程序.更准确地说,我想检测关键事件流中的模式,并能够根据检测到的模式丢弃/插入事件到流中.
我在SO上看过一些相关的问题,但是:
我解释下面的问题,但为了使它更紧凑和易懂,首先是一个小的DSL定义.
A_:用于制作(按)键A.A^:用于中断(释放)键A.A^->[C_,C^,U_,U^]:on A^为C发送一个make/break组合,然后在处理链中向下发送U(最后到应用程序).如果没有->则没有发送任何内容(但可能会修改内部状态以检测后续事件).$X:执行任意操作.这可以发送一些可配置的键事件序列(可能类似于C-x C-semacs),或执行一个函数.如果我只能发送关键事件,那就足够了,因为我可以在窗口管理器中进一步处理这些事件,具体取决于哪个应用程序处于活动状态.好吧,所以使用这种表示法,这里是我想要检测的模式以及我想在处理链中传递的事件.
A_, A^->[A_,A^]:探索.见上文,请注意发送A^.A_, B_, A^->[A_,A^], B^->[B_,B^]:基本上与1.相同但重叠事件不会改变处理流程.A_, B_, B^->[$X], A^:如果在保持另一个键(A)的同时完成了键(B)的完成/中断,则执行X(参见上文),并且丢弃A的中断.(原则上,它是一个简单的状态机,可以在关键事件上实现,可以生成(多个)关键事件作为输出).
所以基本问题是如何实现这一点.
我已经在窗口管理器中使用被动grabs(XGrabKey)和实现了一个解决方案XSendEvent.不幸的是,被动抓取在这种情况下不起作用,因为它们B^在上面的第二种模式中没有正确捕获.原因是转换后的抓斗结束A^并且不继续B^.如果仍然保持,则新的抓取转换为捕获B,但仅在约1秒后.否则,将平原B^发送到应用程序.这可以通过验证xev.
我可以将我的实现转换为使用活动的grab(XGrabKeyboard),但是如果窗口管理器一直在键盘上有活跃的抓取,我不确定对其他应用程序的影响.X文档将活动抓取称为侵入式并且是为短期使用而设计的.如果有人有这方面的经验并且长期积极争夺没有重大缺点,那么我认为这是一个解决方案.
除了窗口管理器(作为X客户端运行)之外,我愿意查看其他关键事件处理层.键盘驱动程序或映射是可能的,只要我可以用它们解决上述问题.这也意味着解决方案不必是单独的应用程序.我很高兴有一个驱动程序或内核模块为我做这个.请注意,我从未做过任何内核或驱动程序编程,所以我会很感激一些好的资源.
感谢您的任何指示!
我正在制作一个全局捕获键盘输入的Windows应用程序.当用户使用应用程序使用的CTRL + ALT + G快捷键组合时
SendKey.Send(Guid.NewGuid().ToString());
Run Code Online (Sandbox Code Playgroud)
在任何文本字段中键入生成的GUID.无论应用程序采取何种输入,它都应该这样做.
当你第一次键入CTRL + ALT + G时,它的工作方式与我的预期完全相同,但后续尝试不会产生任何结果,或者只是非常罕见的成功.
我的意思是,这一切都应该非常简单和一致.我有一个工作的全局键盘钩子,它一直工作,我已经测试过,但SendKey.Send()方法不是每次都有效.
我看过Google的任何与我的问题相关的内容,但到目前为止还没有任何工作.
有人有任何见解吗?
编辑1:我也尝试过使用SendKey.SendWait(),做同样的事情.我真的想要一种更灵敏的方式来使用这种键盘快捷方式生成新的GUID.
编辑2:
以下是代码的基本部分:
/* Initialization Code Here */
// register the event that is fired after the key press.
hook.KeyPressed += new EventHandler<KeyPressedEventArgs>(hook_KeyPressed);
// register the control + alt + F12 combination as hot key.
hook.RegisterHotKey((uint)(HotkeyModifiers.Control | HotkeyModifiers.Alt), Keys.G);
Run Code Online (Sandbox Code Playgroud)
事件代码非常简单:
void hook_KeyPressed(object sender, KeyPressedEventArgs e)
{
SendKeys.SendWait(Guid.NewGuid().ToString());
}
Run Code Online (Sandbox Code Playgroud)
我项目中的其他任何事情都只是松懈.
更新1:
关于这个问题,我确实有更多的问题,但是今天我没有时间继续研究这个问题.我已经实现了Jon Raynor建议使用app.config方法取得一定程度的成功.一旦我解决了我的新问题,我将发布一个编辑,如果我的应用程序按预期运行,可能会关闭此问题.
我正在尝试编写一个简单的全局键盘钩子程序来重定向一些键.例如,当程序执行时,我按键盘上的'a',程序可以禁用它并模拟'b'点击.我不需要图形ui,只需一个控制台即可(保持运行)
我的计划是使用全局钩子来捕获键输入,然后使用keybd_event来模拟键盘.但我有一些问题.
第一个问题是程序可以正确地阻止'A'但是如果我在键盘上点击'A'一次,回调函数中的printf和keybd_event一起被执行两次.所以,如果我打开一个txt文件,我点击'A'一次,有两个'B'输入.这是为什么?
第二个问题是为什么使用WH_KEYBOARD_LL的钩子可以在没有dll的情况下在其他进程上工作?在我写这个例子之前,我认为我们必须使用dll来创建一个全局钩子...
#include "stdafx.h"
#include <Windows.h>
#define _WIN32_WINNT 0x050
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
BOOL fEatKeystroke = FALSE;
if (nCode == HC_ACTION)
{
switch (wParam)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
if (fEatKeystroke = (p->vkCode == 0x41)) { //redirect a to b
printf("Hello a\n");
keybd_event('B', 0, 0, 0);
keybd_event('B', 0, KEYEVENTF_KEYUP, 0);
break;
}
break;
}
}
return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam));
}
int …Run Code Online (Sandbox Code Playgroud) 我正试图找出测试此方法的最佳方法:
document.addEventListener("keydown", function (event) {
var modifiers = event.altKey || event.ctrlKey || event.metaKey ||
event.shiftKey;
var mapped = map[event.which];
if (!modifiers) {
if (mapped !== undefined) {
event.preventDefault();
self.emit("move", mapped);
}
}
});
Run Code Online (Sandbox Code Playgroud)
我想确保如果键是修饰符或者键没有映射,则没有任何反应,但是,如果它们是,则监视self.emit函数.
在某些应用程序中,应用程序直接处理键盘快捷键是有意义的,否则键盘快捷键将绑定到系统范围的组合.例如,⌘-Space(通常是Spotlight)或⌘-Tab(通常是app切换器).这适用于各种Mac应用程序,例如VMWare Fusion,Apple自己的屏幕共享和远程桌面客户端(分别将事件转发到VM或服务器,而不是在本地处理它们),以及应用程序中的一些类似的第三方应用程序商店.
我们希望在我们正在开发的应用程序中实现这样的模式,但是很难确定如何做到这一点.我应该指出,有问题的应用程序是一个常规的前台应用程序,是沙箱,任何解决方案都必须符合App Store规则.商店中的其他应用程序可以执行此操作的事实意味着这必须是可能的.
要清楚,我们希望:
Apple的Event Architecture文档表明前台应用程序应该已经接收了这些事件.(这大约只有同期水平搬运东西,如电力会谈和弹出按钮,这是很好的.)它继续提出,而关键事件文件还暗示说NSApplication的sendEvent:方法就是检测基于修正标志潜在的快捷方式,调度他们到窗口,如果失败,到菜单栏.它没有明确说明全局绑定快捷方式会发生什么.
我尝试了子类化NSApplication和重写sendEvent:.无论我是否将所有事件都传递给超类实现,或者如果我说,过滤修饰键事件,当我按⌘-Space时,我会收到按下并释放命令(⌘)键的事件,但不会显示空格键.Spotlight UI总是会弹出.
我没有从Apple或其他方面找到有关子类化NSApplication及其早期事件处理的更多信息.我似乎无法找出检测和处理全局快捷方式的级别.
有人可以指点我正确的方向吗?
可行的解决方案不起作用:
建议我在其他Stack Overflow帖子中看到但不适用于我见过的其他应用程序(这会破坏App Store规则):
这两个会矫枉过正,无论如何,因为他们让你拦截所有的活动在所有时候,不只是当你的应用程序是前台应用程序.
NSevent的addGlobalMonitorForEventsMatchingMask:handler:同时并不妨碍全球快捷方式处理从发射这些事件,所以甚至没有尝试它.
更新[2014年7月16日]:问题在技术上是不正确的.阅读答案以获取更多详细信息.
我试图在到达我的文本框之前捕获文本.我发现了以下事实:
KeyDown,KeyUp事件将告诉你什么virtualKey被按下而不是角色!!
CoreWindow.CharacterReceived将捕获该字符,但此
事件不是特定于TextBox的,它会
在到达textBox后告诉您该字符.
现在我的问题是:
任何人都可以告诉我如何在Windows Phone 8.1上捕获Swype键盘的事件?

请注意:
1-我试图在TextBox.Paste中捕获它但它失败了:(
2-事件textBox.textChanged()是不是我期待的BEC该事件火灾键盘完成后,该事件(框TextChanged)会发生火灾后keyDown,keyUp,CharacterReceived无论文本是如何输入.
当客户端在选项之间移动时,为什么不会触发键盘事件select?是否还发送了其他事件?
如何重现:
结果:当您使用向上/向下键盘键浏览选项时,不会发送任何事件。
超文本标记语言
<!-- The second value will be selected initially -->
<select name="text"> <!--Supplement an id here instead of using 'text'-->
<option value="value1">Value 1</option>
<option value="value2" selected>Value 2</option>
<option value="value3">Value 3</option>
</select>
Run Code Online (Sandbox Code Playgroud)
JS
function onkeyEvent(evt ){
console.log(evt);
}
window.addEventListener('keyup', onkeyEvent, true);
window.addEventListener('keydown', onkeyEvent, true);
window.addEventListener('keypress', onkeyEvent, true);
Run Code Online (Sandbox Code Playgroud)
仅在选择选项后才会触发更改事件,而不是在客户端选择(在选项中移动)时触发,因此我不接受它作为答案。
我正在尝试检测抖动中的“Enter”、“Delete”和“Backspace”等按键。我使用 a 的问题RawKeyboardListener是它会将注意力从任何子小部件上移开。
例如
RawKeyboardListener(
focusNode: _focusNode,
onKey: handleKey,
child: TextField()
)
Run Code Online (Sandbox Code Playgroud)
这使得无法同时检测和使用两个按键Textfield。
有没有人有检测按键的替代方法。
谢谢
我想检测 Rust 中的 keydown 事件,然后检查是否按下了组合键,以便基于此进行进一步的操作。所以在我的 Rust 应用程序中基本上支持键盘快捷键。
我看过一些板条箱,例如ncurses,但它们不符合我的要求......
我想将按键模拟到 INPUT 对象中。
由于字段的处理方式,我不能只设置元素值。
看起来解决方案与dispatchEvent和有关KeyboardEvent- 但有很多变体并且最不推荐使用。
当前将可打印字符发送到输入字段的现代方式是什么?
keyboard-events ×10
javascript ×3
c# ×2
keyboard ×2
.net ×1
c++ ×1
character ×1
cocoa ×1
dart ×1
dom-events ×1
flutter ×1
hook ×1
linux ×1
macos ×1
mocha.js ×1
nsevent ×1
rust ×1
rust-cargo ×1
sinon ×1
winrt-xaml ×1
xlib ×1