标签: keyboard-events

X11 中的便携式键码?

我想获得与映射无关的键码,但文档说 XKeyEvent 结构中的“键码”取决于硬件和驱动程序,我不能依赖它。如何在 Windows 中获得一些便携式密钥代码,如 VK_*?

x11 keyboard-layout xlib keyboard-events

4
推荐指数
1
解决办法
3655
查看次数

有没有办法在没有 JFrame 的情况下获取键盘事件?

我想让我的程序在用户按下某个快捷方式时取消隐藏主窗口。有没有办法获取全局关键事件,而不仅仅是焦点在应用程序框架内时发生的事件?

java keyboard swing event-listener keyboard-events

4
推荐指数
1
解决办法
1万
查看次数

调试键盘事件,例如'Ctrl + Up Arrow'

我想调试一个程序的一部分,该程序旨在响应键盘输入,如Ctrl+ .

所以,我在区域感兴趣的代码中放了一个断点.但是,一旦按下该Ctrl键,程序就会跳转到该断点.这是我按下箭头键之前发生的,所以我发现这种情况很难调试.

那么,如何调试多键输入事件,如Ctrl+

c# keyboard-events winforms

4
推荐指数
1
解决办法
1282
查看次数

从不调用C++ Console app,SetWindowsHookEx,Callback

我有一个带有嵌入式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)

c++ keyboard-events embedded-v8

4
推荐指数
1
解决办法
2815
查看次数

第一次打开 JDialog 时运行 KeyEventDispacther,然后将其删除

我正在做一个应用程序,它必须通过键盘读取一些字符并解释它们。

为了捕获键,我打开了一个 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)

java swing keyevent jdialog keyboard-events

4
推荐指数
1
解决办法
548
查看次数

如何从 PreTranslateMessage(MSG*pMsg) 中的 WM_KEYDOWN 中提取字符

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)

windows winapi mfc keyboard-events scancodes

4
推荐指数
1
解决办法
2760
查看次数

正确检测键盘布局

我有一个winforms应用程序,我需要获取用户的当前键盘布局.为此,我正在使用System.Windows.Forms.InputLanguage.CurrentInputLanguage.LayoutName.

只要用户将表单作为其活动窗口,一旦他将其他内容聚焦并更改了前一个属性不会返回正确值的语言,它就会正常工作,当表单仍然是活动窗口时,它将返回最后使用的语言.

是否有一种方法可以获得用户键盘布局的名称,即使他没有关注表单,对可以使用的内容没有任何限制.

c# keyboard layout keyboard-events winforms

4
推荐指数
1
解决办法
1778
查看次数

JavaFX:如何同时移动 2 个矩形?

我有 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)

java keyboard javafx keyboard-events

4
推荐指数
1
解决办法
312
查看次数

React Hooks 的 Keydown/up 事件无法正常工作

我正在尝试为我正在开发的游戏创建基于箭头的键盘控件。当然,我正在努力与 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)

我的想法是我做对了,但是作为钩子的新手,很可能这就是问题所在。特别是因为我重新创建了与基于类的组件相同的组件: …

javascript keyboard-events reactjs react-hooks

4
推荐指数
1
解决办法
1万
查看次数

使用键盘上的 Esc 键关闭模态弹出窗口

我还需要使用“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)

javascript keyboard-events modalpopup reactjs reactstrap

4
推荐指数
2
解决办法
4525
查看次数