这个问题来自如何在 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)我需要一些其他方式从 …
我正在处理 WPF KeyDown 事件(来自 Windows.Input 的 KeyEventArgs)。我需要识别用户何时单独按下 F1 和 Ctrl+F1。
private void Window_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key==Key.F1 && Keyboard.IsKeyDown(Key.LeftCtrl))
{
MessageBox.Show("ctrlF1");
}
if (e.Key == Key.F1 && !Keyboard.IsKeyDown(Key.LeftCtrl))
{
MessageBox.Show("F1");
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我按 Ctrl+F1 时,普通的 F1 消息框也会触发。我尝试将 e.Handled 添加到 Ctrl+F1 案例中,但没有帮助。
我的网络应用程序具有涉及按住空格键的键盘快捷键。问题是按住空格键时鼠标光标消失。我认为正在发生的事情是浏览器正在尝试向下滚动(即使在我的情况下从来没有任何东西可以向下滚动)。如果用户在按住空格键的同时移动鼠标光标,则光标会在视图中闪烁,只有当鼠标停止移动时才会再次消失。一旦用户释放空格键,鼠标光标将保持隐藏状态,直到再次移动鼠标,之后光标将保持可见。这种情况发生在 Chrome、Safari、Opera (webkit/blink) 中。
在许多事情中,我尝试了preventDefault()on the event 的规范解决方案,无论我在哪里听,它都不起作用。显然,这是可能的,因为我之前使用过的应用程序使用空格键来执行除向下滚动之外的其他操作。
var html = document.documentElement;
var body = document.getElementsByTagName('body')[0];
document.addEventListener("keydown", function(e) {
console.log("document keydown");
e.preventDefault();
e.stopPropagation();
});
window.addEventListener("keydown", function(e) {
console.log("window keydown");
e.preventDefault();
e.stopPropagation();
});
html.addEventListener("keydown", function(e) {
console.log("html keydown");
e.preventDefault();
e.stopPropagation();
});
body.addEventListener("keydown", function(e) {
console.log("body keydown");
e.preventDefault();
e.stopPropagation();
});
document.addEventListener("keypress", function(e) {
console.log("document keypress");
e.preventDefault();
e.stopPropagation();
});
window.addEventListener("keypress", function(e) {
console.log("window keypress");
e.preventDefault();
e.stopPropagation();
});
html.addEventListener("keypress", function(e) {
console.log("html keypress");
e.preventDefault();
e.stopPropagation();
});
body.addEventListener("keypress", function(e) {
console.log("body keypress");
e.preventDefault(); …Run Code Online (Sandbox Code Playgroud) 背景故事
我是 React(和 Redux)新手,想要编写一个 Web 应用程序,其中交互仅通过键盘/远程事件(箭头键而不是鼠标或触摸)进行,类似于 netflix 在其嵌入式电视应用程序中所做的事情。
我对如何构建这样一个应用程序有一个粗略的想法,但不确定在 ReactJS 中是否有更优雅的方法来做到这一点。
处理组件矩阵内的箭头键交互的想法
我的想法是为容器内的组件提供某种集中状态:
例子
让有一个名为 MyLibrary 的全屏容器组件。它包括 2 个组件:
右侧活动导航的数据列表视图
|-----------------------|
| Nav | List |
| -n1 | 1. Miles |
| -n2 | 2. Bill |
| -n3 | 3. Lester |
| | 4. Herbie |
| | 5. McCoy |
|_______________________|
Run Code Online (Sandbox Code Playgroud)MyLibrary 将导航组件集中在安装上,因此上/下/左/右通过 MyLibrary 传递到导航中。
按下了向下键,因此导航更新了它自己选择的条目状态。
按下了“RIGHT”,但“导航”不处理该键,因此它通知 …
我遇到了问题“keyboardWillShow”触发两次,但“keyboardWillHide”调用一次。
这是一个示例,其中我在“keyboardWillShow”触发后立即打印键盘尺寸。我还在“viewDidLoad”中放置了断点,并且观察者仅注册一次。我添加了两个元素“UITextField”和“UITextView”,两者的行为相同。
我正在使用 iOS 9.2、swift 语言、xcode 7
在我的 ViewController 下面
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name: UIKeyboardWillHideNotification, object: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
print("keyboardWillShow sizes: \(keyboardSize)")
} …Run Code Online (Sandbox Code Playgroud) 开发 Angular / TypeScript 应用程序,其中我们有一个自定义的基本文本编辑器。
尝试适当地处理用户突出显示的选择然后按下按键以替换该选择的情况。
为了解决这个问题,我们需要在插入其预期内容之前正确删除他们选择的“隐藏”组件。
我最初的想法是:
这是我们方法的截断版本onKeyDown:
cloneKeyboardEvent(eventToClone): KeyboardEvent {
return new KeyboardEvent(eventToClone.type, {
key: eventToClone.key,
code: eventToClone.code,
location: eventToClone.location,
ctrlKey: eventToClone.ctrlKey,
shiftKey: eventToClone.shiftKey,
altKey: eventToClone.altKey,
metaKey: eventToClone.metaKey,
repeat: eventToClone.repeat
});
}
onKeyDown($event: KeyboardEvent) {
// Check if there's a selection
if (this.isSelectionRange) {
Helpers.stopEvent($event);
// Delete components in selection
this.deleteComponentsInSelection($event);
const clonedEvent = this.cloneKeyboardEvent($event);
document.dispatchEvent(clonedEvent);
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
一切正常到#4。
该clonedEvent事件与原始事件匹配,但不会触发。debugger我在 的开头插入了 a onKeyDown(),它只在初始按键时被击中一次,而不是在 …
我需要模拟用户以编程方式键入 HTML 元素的交互contenteditable。
我不能使用诸如HTMLElement.onkeypress()或 之类的东西HTMLElement.fire()。
element.innerHTML我无法使用或修改元素的实际代码或内容element.textContent,我需要一种方法来模拟它。
我需要知道何时按下并按住(特定)键。检测后的用例相当简单。当按键被释放时,发送一个信号来停止回调(我已经知道了)。
以下是该算法的粗略方案:
def the_callback():
if key_held == the_hotkey:
someObj.start() # this class Obj works totally well so no issues here on
elif key_released == the_hotkey:
someObj.stop()
else:
# we don't care. continue looking for Keyboard events
# here any kinda listener or just a loop which passes events to the callback
Run Code Online (Sandbox Code Playgroud)
我应该提到,任何阻止执行的侦听器都可以,因为它将在自己的线程中运行(已经pynput.keyboard.Listener在线程中运行,所以不是问题)
我使用pynputand itpynput.keyboard.Listener来检测按键并相应地调用回调,但我无法检测按键何时被按下。
当前的解决方案大致如下:
# not real code. just rough scheme
def on_pressed(key):
if key == my_hotkey:
if running_already: # …Run Code Online (Sandbox Code Playgroud) 我们在运行 Android 11 的摩托罗拉设备上遇到了问题。在其他设备上,即使在 Android 11 上,我们也无法重现此问题。我们已经查看了UnsupportedOperationException:尝试从与某个不相关的上下文获取显示,但该线程是目前不活跃,因为我们没有收到任何回复。
该问题似乎与在 TextInput 字段中打开键盘有关。完整的错误语句如下。
Fatal Exception: java.lang.UnsupportedOperationException
Tried to obtain display from a Context not associated with one. Only visual Contexts (such as Activity or one created with Context#createWindowContext) or ones created with Context#createDisplayContext are associated with displays. Other types of Contexts are typically related to background entities and may return an arbitrary display.
Run Code Online (Sandbox Code Playgroud) 我工作的公司有一个有趣的错误:我们有一个应用程序有很多快捷键,包括“`”(反引号字符),并且由于KeyboardEvent.keyCode已被弃用,因此在重构时对其进行了更改
KeyboardEvent.keyCode === 192\nRun Code Online (Sandbox Code Playgroud)\n到
\nKeyboardEvent.key === \'`\'\nRun Code Online (Sandbox Code Playgroud)\n这适用于没有激活变音符号的键盘 - 例如,没有变音符号的美国键盘,按下 ` 键会立即写入 ` 字符 - 而对于激活变音符号的用户,则不会(在这种情况下,键入 ` 需要按 ` 键,然后按空格),因为例如,如果按 ` 键,然后按字母 a,您将得到字符 \xc3\xa0。显然,激活变音符号后,KeyboardEvent.key会返回Dead,因此我们必须恢复此重构。
话虽如此,使用这个已弃用的功能是否还有其他选择?
\nkeyboard-events ×10
javascript ×5
dom-events ×2
keyboard ×2
android ×1
android-11 ×1
angular ×1
c# ×1
callback ×1
events ×1
html ×1
ios ×1
keydown ×1
macos ×1
motorola ×1
objective-c ×1
pynput ×1
python ×1
reactjs ×1
redux ×1
scroll ×1
swift ×1
tap ×1
typescript ×1
wpf ×1