我需要使用本机DOM函数(没有jQuery)在IE 8中生成keyup事件.以下代码生成,触发并接收事件,但keyCode始终为0.如何正确传递keyCode?
<form><input id="me" type="submit" /></form>
<script type="text/javascript">
var me = document.getElementById("me");
me.attachEvent("onkeyup", function(e) {
alert(e.keyCode); // => 0
});
document.getElementById("me").fireEvent('onkeyup', 13);
</script>
Run Code Online (Sandbox Code Playgroud) javascript dom keyboard-events internet-explorer-8 dom-events
在Qt的QKeyEvent,我可以检查是否Ctrl被检查,如果按下ev->key()是Qt::Key_Control.但是如何区分左右Ctrl键呢?
我也需要Alt和Shift键相同的东西.
我试图了解如何使用Qt处理各种事件,并发现了一个我无法理解的关键修饰符Ctrl Shift Alt等问题.我在Qt Creator中创建了一个默认的Qt GUI应用程序,扩展了QMainWindow并且发现以下示例不会产生可理解的结果.
void MainWindow::keyPressEvent(QKeyEvent *event)
{
qDebug() << "Modifier " << event->modifiers().testFlag(Qt::ControlModifier);
qDebug() << "Key " << event->key();
qDebug() << "Brute force " << (event->key() == Qt::Key_Control);
}
Run Code Online (Sandbox Code Playgroud)
当暴力方法返回正确的值时,对事件使用modifiers()函数永远不会成立.
我做错了什么?
我知道keyboardWillShow和keyboardWillHide事件:
override public func viewWillAppear(animated: Bool) {
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)
}
Run Code Online (Sandbox Code Playgroud)
但是使用iOS8中的新键盘,键盘能够在不关闭键盘的情况下进行更改,而我想知道如何在键盘大小更改时调用函数.谁知道?谢谢.
编辑:它现在调用帧更改但使用此代码:
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
NSLog("\(keyboardSize.height)")
}
Run Code Online (Sandbox Code Playgroud)
它返回旧的键盘高度,例如当帧变为"224.0"时它返回"253.0",好像高度没有按照调用代码的时间更新,当它变为"253.0"时它再次返回旧的高度这是"224.0"
编辑2:我使用"UIKeyboardFrameEndUserInfoKey"而不是使用"UIKeyboardFrameBeginUserInfoKey",它现在正在工作.
我尝试在特定的模拟Enter中.这是我的代码:JavaScriptTextArea
function enter1() {
var keyboardEvent = document.createEvent('KeyboardEvent');
var initMethod = typeof keyboardEvent.initKeyboardEvent !== 'undefined' ? 'initKeyboardEvent' : 'initKeyEvent';
keyboardEvent[initMethod]('keydown', // event type : keydown, keyup, keypress
true, // bubbles
true, // cancelable
window, // viewArg: should be window
false, // ctrlKeyArg
false, // altKeyArg
false, // shiftKeyArg
false, // metaKeyArg
13, // keyCodeArg : unsigned long the virtual key code, else 0
13 // charCodeArgs : unsigned long the Unicode character associated with the depressed …Run Code Online (Sandbox Code Playgroud) 可能的重复:
jQuery 的转义键的键码
这段小代码对 Firefox 和 Opera 来说就像一个魅力。Internet Explorer 不喜欢它。
window.document.onkeydown = function (e) {
if (!e) {
e = event;
}
if (e.keyCode == 27) {
myfunction();
}
}
Run Code Online (Sandbox Code Playgroud)
IE 中不能检测 ESC 的按键吗?谢谢
我是 Qt 的新手,但我正在尝试在 Qt 应用程序中实现基本上相当于视频游戏式输入循环的内容(我知道这很疯狂,但看看你是否能提供帮助)。我需要对所有按键(包括修饰键)的按键和按键释放进行准确的一对一事件处理,无论您如何奇怪地敲击键盘。
当然,您对关键事件的主要访问是通过QKeyEvent。但假设发生以下情况:
据我所知,我从 Qt 得到的是:
Qt::Key_Ctrl)Qt::Key_Up)key() == Qt::Key_Up和 Ctrl 位,反映在修饰符更改中。这可能不完全准确,但这是我对问题进行过多调试后所发生情况的最佳猜测。无论如何,涉及修饰符时的按键释放事件都非常不可靠。
最后的 Ctrl+Up 序列就是问题所在。现在,我知道我正在 中获取修改器状态e->modifiers(),并且正在 中获取按键e->key()。我可以做一些复杂的黑客,尝试在内部记住修改器状态,以检测用户何时释放修改器。但是,Qt 文档告诉我,谈到e->modifiers():
这个函数并不总是可信的。例如,用户可以通过同时按下两个 Shift 键并释放其中一个键来混淆它。
这正是我试图避免的情况。
在 Qt 中,是否有任何可靠的方法来跟踪普通键和修饰键的一对一按键按下和释放?如果没有,你能得到的最接近的是什么?
编辑:我可以稍微完善一下。看起来,如果您按住CmdMac,按下几个键(例如字母键),释放它们,然后释放Cmd,您不会收到字母键释放的释放事件。 我将尝试隔离一个小示例,看看这是否确实是 …
我正在开发一个基本的击键转换器应用程序。该转换适用于以下情况:
CFRunLoopSourceRef runLoopSource = NULL;
CFMachPortRef eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, kCGEventMaskForAllEvents, myCGEventCallback, NULL);
runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
CGEventTapEnable(eventTap, true);
Run Code Online (Sandbox Code Playgroud)
正如您所料,kCGEventMaskForAllEvents除了键盘之外,任何鼠标移动或单击都会不断触发,我怀疑会占用系统资源。我尝试替换,我可以从Quartz Event 文档中关于事件类型CGEventMaskBit(kCGEventKeyDown)的最佳信息看出这是我想要的,并且会消除鼠标移动和点击。不幸的是,使用它似乎只是吃掉了击键,而不是转换它们。
我究竟做错了什么?
以下内容有效,但我仍然不明白为什么CGEventMaskBit(kCGEventKeyUp)它本身不是正确的实现。
CGEventMaskBit(kCGEventKeyUp) | CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(NX_SYSDEFINED)
Run Code Online (Sandbox Code Playgroud) 我有一个 Win32 窗口消息循环。CTRL我想通过+拦截“复制到剪贴板” C。
我目前的做法是这样处理:
...
case WM_KEYDOWN:
TranslateMessage(&message);
// Intercept Ctrl+C for copy to clipboard
if ('C' == message.wParam && (::GetKeyState(VK_CONTROL)>>15))
{ // do the copy... }
...
Run Code Online (Sandbox Code Playgroud)
除了显式检查击键组合之外,还有更好的方法吗?
有没有某种方法可以注册标准的复制到剪贴板击键然后处理WM_COPY消息?
这个问题来自如何在 OSX 上挂接/重新映射任意键盘事件?
到目前为止,我可以使用以下方式点击修饰键和大多数其他键:
_eventTap = CGEventTapCreate( kCGHIDEventTap,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
CGEventMaskBit( kCGEventKeyDown )
| CGEventMaskBit( kCGEventFlagsChanged )
,
(CGEventTapCallBack)_tapCallback,
(__bridge void *)(self));
Run Code Online (Sandbox Code Playgroud)
值得注意的是,在采取行动之前F3正确报告键码 (160) 。即我可以通过让事件处理程序返回 NULL 来禁用该操作(从而无法传播事件)。
但是,F7 到 F12 和弹出/电源不会触发回调。
如果我添加:
| CGEventMaskBit( NSSystemDefined )
Run Code Online (Sandbox Code Playgroud)
...现在剩余的 Fx 键确实会触发回调(尽管 Power/Eject 仍然不会),但我无法访问事件的 keyCode 方法。
它会产生一个错误:
2015-05-21 12:30:02.044 tap_k[16532:698660] NSSystemDefined: 0 2015-05-21 12:30:02.044 tap_k[16532:698660] * 在 -[NSEvent keyCode]、/SourceCache/AppKit/ 中断言失败AppKit-1347.57/AppKit.subproj/NSEvent.m:2471 2015-05-21 12:30:02.045 tap_k[16532:698660] *由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“发送到事件“NSEvent 的消息无效” : 类型=SysDefined loc=(882,687) 时间=118943.3 标志=0 win=0x0 winNum=0 ctxt=0x0 子类型=8 data1=2560 data2=-1"'
所以要么:
(1)我需要一些其他方式从 …
keyboard-events ×10
javascript ×3
qt ×3
c++ ×2
dom-events ×2
keyboard ×2
macos ×2
cgeventtap ×1
cocoa ×1
ctrl ×1
dom ×1
enter ×1
events ×1
html ×1
ios ×1
objective-c ×1
swift ×1
tap ×1
winapi ×1
xcode ×1