我想获得与映射无关的键码,但文档说 XKeyEvent 结构中的“键码”取决于硬件和驱动程序,我不能依赖它。如何在 Windows 中获得一些便携式密钥代码,如 VK_*?
我想让我的程序在用户按下某个快捷方式时取消隐藏主窗口。有没有办法获取全局关键事件,而不仅仅是焦点在应用程序框架内时发生的事件?
我想调试一个程序的一部分,该程序旨在响应键盘输入,如Ctrl+ ↑.
所以,我在区域感兴趣的代码中放了一个断点.但是,一旦按下该Ctrl键,程序就会跳转到该断点.这是在我按下箭头键之前发生的,所以我发现这种情况很难调试.
那么,如何调试多键输入事件,如Ctrl+ ↑?
我有一个带有嵌入式v8引擎的小型控制台应用程序,我想添加一个钩子来注册关键事件.这在我使用Qt和QtScript之前都有效,但是我将它全部移植到VC++ 2008中的直接C++.应用程序编译并运行,但钩子永远不会被调用,这里是相关的代码:
在主()
HWND hwndC = GetConsoleWindow() ;
HINSTANCE hInst = (HINSTANCE)GetWindowLong( hwndC, GWL_HINSTANCE );
if (SetWindowsHookEx(WH_KEYBOARD_LL, HookProc, hInst, NULL) == 0) {
printf("Failed to set hook\n");
} else {
printf("Hook established\n");
}
g->RunScript(argc,argv);
Run Code Online (Sandbox Code Playgroud)
过程:
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
printf("HookProc called\n");
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam);
if (wParam == WM_KEYDOWN) {
keyDown(p,g);
} else if (wParam == WM_KEYUP) {
keyUp(p,g);
}
fflush(stdout);
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
Run Code Online (Sandbox Code Playgroud)
这实际上是对v8示例代码中shell.cc的扩展.我想知道它是否以某种方式阻止?我承认我不知道我在这里做什么,只是在玩耍和学习,但这个让我感到难过.
在keyDown里面说,我有这样的事情:
v8::Handle<v8::String> callback_name = v8::String::New("onKeyDown");
v8::Handle<v8::Value> …Run Code Online (Sandbox Code Playgroud) 我正在做一个应用程序,它必须通过键盘读取一些字符并解释它们。
为了捕获键,我打开了一个 JDialog 并设置了一个 KeyEventDispatcher,这样我就可以在 dispatchKeyEvent 方法中捕获字符。在 JDialog 中,有一个按钮可以删除 KeyEventDispatcher 并处理 JDialog。
它有两个问题:
- 第一次打开 JDialog,就像没有设置 KeyEventDispatcher
- 当我关闭并打开这个 JDialog 时,KeyEventDispatchers 正在累积(第一次打开,没有运行;第二次打开,有一个正在运行,第 3 次打开,有 2 个正在运行,...)
似乎 KeyEventDispacthers 是在 JDialog 关闭但未删除时设置的,而不是在 JDialog 打开时设置并在关闭时删除。
有人可以帮助我了解发生了什么以及我该如何解决?
这是 JDialog 类的简化版本(只有关键捕获部分):
public class SequenceDialog {
private JDialog dialog;
private JButton finishButton;
private DialogKeyEventDispatcher keyEventDispatcher;
public SequenceDialog() {
initializeDialog();
}
private void initializeDialog() {
dialog = new JDialog();
finishButton = new JButton("Finish");
finishButton.addActionListener(new FinishButtonListener());
dialog.setModalityType(ModalityType.APPLICATION_MODAL);
dialog.add(finishButton);
setKeyListener();
dialog.setVisible(true);
dialog.pack();
}
/** Adds the KeyEventDispacther */ …Run Code Online (Sandbox Code Playgroud) 在PreTranslateMessage(MSG *pMsg)从 a 继承的 MFC 应用程序中CView,我有这个:
if (pMsg->message == WM_KEYDOWN) ...
Run Code Online (Sandbox Code Playgroud)
此处WM_KEYDOWN记录了 a中的字段。虚拟键值位于并包含多个字段,其中第 16-23 位为键盘扫描码。VK_pMsg->wParampMsg->lParam
所以在我的代码中我使用:
const int virtualKey = pMsg->wParam;
const int hardwareScanCode = (pMsg->lParam >> 16) & 0x00ff; // bits 16-23
Run Code Online (Sandbox Code Playgroud)
例如,在我的非美式键盘上,当我按下“#”字符时,我得到以下信息:
virtualKey == 0xde --> VK_OEM_7 "Used for miscellaneous characters; it can vary by keyboard."
hardwareScanCode == 0x29 (41 decimal)
Run Code Online (Sandbox Code Playgroud)
我想“捕获”或以不同方式处理的字符是 ASCII“#”,0x23(十进制 35)。
我的问题
WM_KEYDOWN无论语言或键盘布局如何,我如何翻译信息以获得我可以比较的内容?我需要确定#用户使用的是标准美式键盘还是其他键盘。
例如,我一直在研究以下功能,例如:
MapVirtualKey(virtualkey, MAPVK_VSC_TO_VK);
// previous line is useless, the key …Run Code Online (Sandbox Code Playgroud) 我有一个winforms应用程序,我需要获取用户的当前键盘布局.为此,我正在使用System.Windows.Forms.InputLanguage.CurrentInputLanguage.LayoutName.
只要用户将表单作为其活动窗口,一旦他将其他内容聚焦并更改了前一个属性不会返回正确值的语言,它就会正常工作,当表单仍然是活动窗口时,它将返回最后使用的语言.
是否有一种方法可以获得用户键盘布局的名称,即使他没有关注表单,对可以使用的内容没有任何限制.
我有 2 个矩形代表我的 Pong 游戏的桨。我对一个矩形使用 W/S,对第二个矩形使用 UP/DOWN。当我按 W 移动一个矩形,然后按 UP 移动第二个矩形时,第一个矩形将停止移动,然后第二个矩形将移动。如何使两个矩形可以同时移动?
GraphicsContext gc;
Rectangle player11;
Rectangle player22;
Circle ball;
private int y1;
private int p1y = 381;
private int y2;
private int p2y = 381;
AnimateObjects animate;
Canvas canvas;
private AnimationTimer timer = new AnimationTimer() {
public void handle(long now) {
// update paddle positions
p1y += y1;
p2y += y2;
if (p1y < 0) {
p1y = 0;
}
if (p2y < 0) {
p2y = 0;
}
player11.setY(p1y); …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我正在开发的游戏创建基于箭头的键盘控件。当然,我正在努力与 React 保持同步,所以我想创建一个函数组件并使用钩子。我为我的错误组件创建了一个JSFiddle。
它几乎按预期工作,除非我同时按下很多箭头键。然后似乎keyup没有触发某些事件。也可能是“状态”未正确更新。
我喜欢这样:
const ALLOWED_KEYS = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight']
const [pressed, setPressed] = React.useState([])
const handleKeyDown = React.useCallback(event => {
const { key } = event
if (ALLOWED_KEYS.includes(key) && !pressed.includes(key)) {
setPressed([...pressed, key])
}
}, [pressed])
const handleKeyUp = React.useCallback(event => {
const { key } = event
setPressed(pressed.filter(k => k !== key))
}, [pressed])
React.useEffect(() => {
document.addEventListener('keydown', handleKeyDown)
document.addEventListener('keyup', handleKeyUp)
return () => {
document.removeEventListener('keydown', handleKeyDown)
document.removeEventListener('keyup', handleKeyUp)
}
})
Run Code Online (Sandbox Code Playgroud)
我的想法是我做对了,但是作为钩子的新手,很可能这就是问题所在。特别是因为我重新创建了与基于类的组件相同的组件: …
我还需要使用“ESC”键关闭模态,此时它正在关闭“CLOSE”和“CONFIRM”按钮。我正在使用 reactstrap,react hooks。键盘 {show} 和 handleClose 它不起作用。
这是代码:
const DeleteUserModal = props => {
const { user, show } = props;
const deleteUser = async () => {
await props.removeUser(user);
props.onCloseModal();
};
const handleKeyPress = target => {
if (target.charCode === ENTER_KEY) {
deleteUser();
}
};
return (
<div onKeyPress={handleKeyPress}>
<Modal isOpen={show} toggle={props.onCloseModal} >
<ModalHeader toggle={props.onCloseModal}>
<IntlMessages id="modal.delete.user.title" />
</ModalHeader>
<ModalBody>
<IntlMessages id="modal.delete.user.description" />
</ModalBody>
<ModalFooter>
<Button className="cancel" onClick={props.onCloseModal}>
<IntlMessages id="modal.common.cancel" />
</Button>
<Button className="action" onClick={deleteUser}>
<IntlMessages id="modal.common.ok" />
</Button> …Run Code Online (Sandbox Code Playgroud) keyboard-events ×10
java ×3
keyboard ×3
c# ×2
javascript ×2
reactjs ×2
swing ×2
winforms ×2
c++ ×1
embedded-v8 ×1
javafx ×1
jdialog ×1
keyevent ×1
layout ×1
mfc ×1
modalpopup ×1
react-hooks ×1
reactstrap ×1
scancodes ×1
winapi ×1
windows ×1
x11 ×1
xlib ×1