我正在尝试编写一个跨平台的python程序,它将在后台运行,监视所有键盘事件,当它看到一些特定的快捷方式时,它会生成一个或多个自己的键盘事件.例如,将Ctrl- @映射到"my.email@address"可能很方便,因此每次某个程序询问我的电子邮件地址时,我只需要输入Ctrl- @即可.
我知道这些程序已经存在,我正在重新发明轮子......但我的目标只是了解有关低级键盘API的更多信息.此外,这个问题的答案可能对其他程序员有用,例如,如果他们想要启动需要密码的SSH连接,而不使用pexpect.
谢谢你的帮助.
注意:有一个类似的问题,但它仅限于Windows平台,并且不需要python.我正在寻找跨平台的python api.还有其他与键盘事件有关的问题,但显然他们对系统范围的键盘事件不感兴趣,只是特定于应用程序的键盘快捷键.
编辑:我应该在这里增加一个声明:我不是想写一个键盘记录.如果我需要一个键盘记录器,无论如何我都可以从网上下载一个.;-)
我从一个新的Delphi VCL应用程序开始,将Menus添加到uses子句,在表单上放一个标签,并指定表单的OnShortCut事件:
procedure TForm1.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
Label1.Caption := ShortCutToText(ShortCut(Msg.CharCode, KeyDataToShiftState(Msg.KeyData)));
end;
Run Code Online (Sandbox Code Playgroud)
在XP上,这适用于我尝试过的所有快捷键组合,包括Shift+ Ctrl+ 0.在Vista和Windows 7上,测试应用程序显示Shift+ Ctrl+ 1到Shift+ Ctrl+ 9,但不显示Shift+ Ctrl+ 0.其他组合如Shift+ 0,Ctrl+ 0,甚至Shift+ Ctrl+ Alt+ 0都可以正常显示.
在调试器下运行应用程序,我发现如果在按下键的同时按住Shift和Ctrl键,则永远不会使用Msg.CharCode = Ord('0')触发OnShortCut事件0.
Delphi IDE在Vista下也存在同样的问题. Ctrl+ Shift+ 1设置书签1,但Ctrl+ Shift+ 0不设置书签0,它应该. …
我想在eclipse(3.7.2)中设置一些涉及键("windows"键)的键绑定,但是当我按下它时它似乎没有拿起那个修饰键.为什么?我能做什么才能检测到它?
我有一个HTML表单.用户可以用英语和波斯语填写表格.但我有一个验证码输入,用户应该用英语填写它.
如果用户的键盘布局是波斯语,则在此字段中键入的内容应更改为英语,因此我需要一些编码,以便在关注此输入文本时更改键盘布局.
可以用javascript改变键盘布局吗?
我正在制作一个小文字游戏,我需要获取用户在键盘上输入的最后一个字符.我想到了两种方法.
第一个是通过监听文档键盘事件并通过键码获取每个char.直到我开始用键盘死键(如Â)编写字符时,它工作得非常好.String.fromCharCode(e.keyCode)将其转换为A,因为keyCode用于A,但事件似乎没有关于事件产生的死键或真实字符的事件.
第二个是保持隐藏的输入总是聚焦(坏)和键盘事件获取输入值的最后一个字符,但这只有在我写得非常慢的情况下才有效.我的代码看起来像这样:
function is_char(e){
return (!e.ctrlKey && !e.altKey && !e.metaKey &&
(e.keyCode >= 65 && e.keyCode <= 90) ||
(e.keyCode >= 97 && e.keyCode <= 122)
);
}
$('#fake_input').on('keyup', function(e){
if (is_char(e)){
$('#result').append(this.value[this.value.length - 1]);
}
}).focus();
Run Code Online (Sandbox Code Playgroud)
这是一个工作示例 - http://jsfiddle.net/YkaBm/1/ - 你应该在输入下面得到相同的单词,但是当你写得快一点时,结果是错误的.
你有什么建议如何获得键盘事件的真实(正确)字符或为什么输入键盘事件是这样的?
更新!
正如我在评论中提到的那样,semir.babajic的回答并不适用于我的案例,但多亏了Semir我发现这个愚蠢的解决方案有效:
function is_char(e){
return (!e.ctrlKey && !e.altKey && !e.metaKey &&
(e.keyCode >= 65 && e.keyCode <= 90) ||
(e.keyCode >= 97 && e.keyCode <= 122)
);
}
var x = 0;
$('#fake_input').on('keyup', function(e){
if (e.keyCode …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来设计一个带有修改键的小面板(例如,shift,命令),并且必须像虚拟键盘一样点击它.
我希望它有这种行为:
这是我正在使用的代码:
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
CGEventRef shiftKeyDown = CGEventCreateKeyboardEvent(source, (CGKeyCode)56, YES);
CGEventRef shiftKeyUp = CGEventCreateKeyboardEvent(source, (CGKeyCode)56, NO);
CGEventPost(kCGAnnotatedSessionEventTap, shiftKeyDown);
CGEventPost(kCGAnnotatedSessionEventTap, shiftKeyUp);
CFRelease(shiftKeyUp);
CFRelease(shiftKeyDown);
CFRelease(source);
Run Code Online (Sandbox Code Playgroud)
在我再次点击它之前,我找不到按下它的方法.我虽然"Push On Push Off"按钮细胞类型是关键,但不幸的是没有.:-)
任何帮助?
提前致谢.
我已经进入了一些Electron项目,我正在试图弄清楚如何在应用程序处于后台时监听任何按键或跟踪鼠标移动.我正在使用菜单栏插件,因此应用程序仍然在后台运行.
我尝试使用全局快捷方式 API,但它看起来只是用于快捷方式而且您无法注册单个按键.我还查看了API,还没有在应用程序主屏幕外找到键击和鼠标移动的事件.
如果键盘上有播放/暂停/等按钮(音乐控制快捷键),按下它们,iTunes将打开(至少在Mac上).
如果你最近打开了另一个音乐播放器,比如Spotify,它实际上会截取快捷键,iTunes也不会做任何事情.
好吧,我想制作一个带有Java的音乐播放器,我希望有相同的行为.我希望我的应用程序拦截这样的快捷方式,其他程序不应该干涉.
我正在使用JavaFX,虽然我认为这不重要.
我怎样才能做到这一点?
我已经能够检测到用户使用JNativeHook按下的键,但我不知道如何拦截键,以便其他应用程序不会使用它们.
我希望捕获删除键按下,并在按下键时不执行任何操作.如何在WPF和Windows窗体中执行此操作?
我们正在创建一个看起来像桌面窗口的Web用户界面.现在我们需要处理Alt密钥.当Alt按下键焦点转到上一级菜单.
在Javascript中,Alt当Alt按下ONLY 键时如何获取键的事件?我需要确保没有同时按下其他键.
提前致谢.
keyboard-events ×10
javascript ×4
c# ×1
cocoa ×1
delphi ×1
dom-events ×1
eclipse ×1
electron ×1
java ×1
jquery ×1
keyboard ×1
linux ×1
python ×1
windows-key ×1
winforms ×1
wpf ×1
xmodmap ×1