标签: keyboard-events

SendInput() 和非英文字符和键盘布局

在 Windows 中使用非英语输入键盘语言时,我无法模拟字符按键。

我尝试使用 KEYEVENTF_UNICODE 调用 SendInput():

KEYBDINPUT ki;
INPUT input;
int character = 0;

ki.wVk = 0;
ki.wScan = character;
ki.dwFlags = KEYEVENTF_UNICODE;
ki.time = 0;
ki.dwExtraInfo = 0;   
input.type = INPUT_KEYBOARD;
input.ki = ki;
SendInput(1, &input, sizeof(INPUT));
Run Code Online (Sandbox Code Playgroud)

这实际上有效(当然,在我的代码中,我也在按下键后执行 KEYUP)...除了在 GTK+ 应用程序中(可能还有其他情况下它也不起作用)。

根据MSDN如果指定了 KEYEVENTF_UNICODE,SendInput 将 WM_KEYDOWN 或 WM_KEYUP 消息发送到前台线程的消息队列,wParam 等于 VK_PACKET。一旦 GetMessage 或 PeekMessage 获得此消息,将消息传递给 TranslateMessage 会发布一条 WM_CHAR 消息,其中包含最初由 wScan 指定的 Unicode 字符。如果将这个 Unicode 字符发送到 ANSI 窗口,它将自动转换为适当的 ANSI 值。

所以我相信当 KEYEVENTF_UNICODE 被传递时,SendInput() 的功能是不同的......不像通常那样低级。

在我的一生中,我想不出任何其他方法让 SendInput() 为用户的键盘语言正确打印字符。例如,如果键盘输入语言是“瑞典语”,我不能让它输出'@'(而是打印出一个引号),我不能让它正确输出非ASCII字符,要么(重音字母等)。 …

windows unicode keyboard-layout keyboard-events

5
推荐指数
1
解决办法
4744
查看次数

jQuery Keyup Ajax 请求:杀死以前的请求

我有一个脚本,它在我的搜索输入框中的 keyup 事件上执行 ajax 请求。我在 Firefox 中注意到(我正在查看控制台),发送的每个请求都完成了。所以有大量的ajax请求发生。

无论如何要在keyup事件中杀死正在进行的ajax请求?

jQuery:

jQuery(function() {
  var request;
  request = function(url, keyword) {
    return $.post('/backpack/' + url + '/search?keyword=' + keyword, function(data) {
      var el;
      el = "#result_" + url;
      return $(el).html(data);
    });
  };
  $("#search_text").bind("keyup", function() {
    var query, url, _i, _len, _ref;
    query = $(this).val();
    if (query.length > 2) {
      _ref = ['tracks', 'albums', 'artists'];
      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        url = _ref[_i];
        request(url, query);
      }
      return …
Run Code Online (Sandbox Code Playgroud)

jquery keyboard-events

5
推荐指数
1
解决办法
5392
查看次数

确定事件键是否为文本(不仅仅是字母数字)

我有一个带有事件的文本框,当输入一些文本时,它应该做一些事情。很容易检查它是否是字母数字,如此处所述我可以确定 KeyEventArg 是字母还是数字吗?

if ( ( ( e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z ) ||
( e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9 ) ||
( e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9 ) )
Run Code Online (Sandbox Code Playgroud)

这种方法的问题是,我也应该手动检查-?!¿[]()Key.OemMinusKey.OemQuestion等等。

有什么方法可以检查它是文本按键还是我应该手动检查(在我看来这不是很优雅)?

c# wpf keyboard-events

5
推荐指数
1
解决办法
5625
查看次数

如何忽略除一系列快速 Javascript 事件中的最后一个之外的所有事件?

由于 'changeCursor' 事件(我正在使用 ACE 编辑器),我的一个脚本在某个时候调用了一个函数。当我多次按下它时,这会减慢光标的移动速度。

我真的很想调用这个函数,但是如果只在我的光标停止移动时才调用它就可以了(即我不需要查看中间状态)。

有没有一种标准方法可以忽略最后一个事件之外的所有事件?

javascript events keyboard-events

5
推荐指数
1
解决办法
703
查看次数

使用 NodeJS 在 Linux 上捕获全局键盘事件

我有一台运行 Node 的无头 Debian ARM 机器。该设备具有硬按钮,这些按钮使用 映射到普通键盘事件gpio-keys

我的目标是从硬按钮以及 Node.js 中的任何附加键盘捕获全局事件。我需要一个解决方案,它可以独立于运行它的终端捕获 keydown/keyup 事件(它将通过 SSH 会话运行)。它不必是跨平台的,只要它适用于 ARM Debian,我就会接受它。

我正在想象直接从任何sysfs必要的属性中读取的东西,但这不是必需的。

谁可以帮我这个事?我被困了一段时间。

linux keyboard-events node.js sysfs

5
推荐指数
1
解决办法
1932
查看次数

在某些情况下,GetKeyboardLayout()无法正常工作

我正在编写应该指示键盘布局的控制台应用程序.我正在使用GetForegroundWindow()函数获取当前活动窗口,函数GetWindowThreadProcessId()获取线程ID,最后,使用函数GetKeyboardLayout()我得到键盘布局.除了某些情况之外,我尝试的任何应用都可以正常工作:

  1. 当我将窗口切换到cmd.exe或任何其他控制台应用程序时,它显示默认布局,更改布局无效
  2. 在游戏中是相同的情况
  3. 同一进程的所有线程都具有相同的布局[在explorer.exe上测试(这让我很困惑,因为我认为布局是线程指定的)

请解释一下发生了什么.下面是我的测试代码

#include <Windows.h>
#include <iostream>

int main()
{
    while(8)
    {
        HWND  _curr_window = GetForegroundWindow();
        DWORD _curr_window_procces_id;
        DWORD _curr_window_thread_id = GetWindowThreadProcessId(_curr_window, &_curr_window_procces_id);
        std::cout << "Process ID is " << _curr_window_procces_id << " and Thread ID is " << _curr_window_thread_id << std::endl;
        HKL _key_locale = GetKeyboardLayout(_curr_window_thread_id);
        std::cout << "Keyboard layout is " << _key_locale << std::endl;
        Sleep(1000);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

winapi keyboard-events visual-c++

5
推荐指数
1
解决办法
723
查看次数

在 C# 中记住和重放击键:同步问题

我是 PC 游戏的速通玩家(喜欢以尽可能快的方式完成游戏的人),我想在玩游戏时记录我的输入,以便稍后自动重播。所以我创建了一个小 C# 程序来做到这一点:基本上,它会启动一个计时器,每次我按下/松开一个键时,它都会保存操作(keyup/keydown)、键以及我这样做的毫秒数。然后,当我想再次播放它时,它会启动一个计时器,当它达到发生击键的毫秒时,它会重现它。

它有效!嗯...事实上,它几乎可以工作:键复制得很好,但有时,它们有点不同,导致我之前成功的意外死亡。

这是显示问题的视频:https : //www.youtube.com/watch?v=4RPkcx68hpw&feature=youtu.be

上面的视频是重制键,下面的视频是原版播放。一切似乎都相似,直到第 3 个房间,原始戏剧击中“蜘蛛”并使其返回,而复制的键不接触它,因此它干扰了其余的进程。当然,这部分游戏是 100% 确定的,因此相同的输入会导致相同的结果。通过在我的视频编辑器中逐帧推进视频,当角色爬上第一个板条箱时,我清楚地看到了 2 帧的差距,并且这个差距继续扩大。

这是我的(大量评论)代码:

KeysSaver.cs,保存我输入的类

class KeysSaver
{
    public static IntPtr KEYUP = (IntPtr)0x0101; // Code of the "key up" signal
    public static IntPtr KEYDOWN = (IntPtr)0x0100; // Code of the "key down" signal
    private Stopwatch watch; // Timer used to trace at which millisecond each key have been pressed
    private Dictionary<long, Dictionary<Keys, IntPtr>> savedKeys; // Recorded keys activity, indexed by the millisecond the …
Run Code Online (Sandbox Code Playgroud)

c# keystroke keyboard-hook recorder keyboard-events

5
推荐指数
1
解决办法
1013
查看次数

检测 JavaFX 中的单个按键

我在检测 JavaFX 中的单个按键时遇到问题。我必须检测箭头键,但每次我按下这些键中的任何一个时,我的代码的一部分都会被多次调用。我意识到这是因为AnimationTimer()是一个循环,因此这就是原因,但我不知道如何检测单键点击。无论如何,这是代码:

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.input.KeyEvent;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import java.util.HashSet;

public class Main extends Application {

    Stage window;
    static Scene scene;

    private static char[][] mapa = {
            {'X','X','X','X','X'},
            {'X','.','.','.','X'},
            {'X','.','M','.','X'},
            {'X','.','.','.','X'},
            {'X','X','X','X','X'}
    };

    private final int sizeX = 16;
    private final int sizeY = 16;

    static HashSet<String> currentlyActiveKeys;

    @Override
    public void start(Stage primaryStage) throws Exception {

        window = primaryStage;
        window.setTitle("Hello World");

        Group root …
Run Code Online (Sandbox Code Playgroud)

java javafx keyboard-events

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

Python 检查鼠标是否被点击

所以我试图用 Python 构建一个简短的脚本。我想要做的是,如果单击鼠标,鼠标将重置到某个任意位置(现在是屏幕中间)。我希望它在后台运行,因此它可以在操作系统(很可能是 Chrome 或某些网络浏览器)中运行。我也希望用户可以按住某个按钮(比如 ctrl),然后他们可以点击离开而不重置位置。这样他们就可以毫无挫折地关闭脚本。

我很确定我知道如何做到这一点,但我不确定要使用哪个库。我更喜欢它是跨平台的,或者至少是 Windows + Mac。到目前为止,这是我的代码:

#! python3
# resetMouse.py - resets mouse on click - usuful for students with
# cognitive disabilities.

import pymouse

width, height = m.screen_size()
midWidth = (width + 1) / 2
midHeight = (height + 1) / 2

m = PyMouse()
k = PyKeyboard()


def onClick():
    m.move(midWidth, midHeight)


try:
    while True:
        # if button is held down:
            # continue
        # onClick()
except KeyboardInterrupt:
    print('\nDone.')
Run Code Online (Sandbox Code Playgroud)

python mouseevent keyboard-events

5
推荐指数
2
解决办法
2万
查看次数

渲染时 TextInput 闪烁/断断续续的行为

我是 React Native 的新手,我一直在研究一个搜索栏,它可以在用户输入字段时过滤列表。这是它的样子......

<TextInput style={{width: '100%', textAlign: 'center'}}
  ref={(ref) => this.searchInput = ref}
  placeholder="Search"
  onChangeText={ (text) => this.onChangeText(text)}
  value={this.state.search} />
Run Code Online (Sandbox Code Playgroud)

这是我用于此行为的 onChangeText 方法

onChangeText(text) {
    var filtered;

    this.setState({search: text});
    filtered = this.props.data.filter((item) => {
        if(item.section) {
          return true;
        }
        return (item.label.toLowerCase().includes(text.toLowerCase()));
    });

    this.setState({filteredList: filtered});
}
Run Code Online (Sandbox Code Playgroud)

我已将状态设置为保留用户在搜索栏中输入的任何内容,因为它会在渲染时清除。这工作正常,除了每次组件重新渲染时键盘一直关闭(在用户输入/删除的每个字符上)。

为了解决这个问题,我尝试使用像这样的 refs 专注于输入

componentDidUpdate() {
    if(this.searchInput) {
        this.searchInput.focus();
    }
}
Run Code Online (Sandbox Code Playgroud)

但即便如此,键盘还是会时不时地播放打开/关闭动画,并且无法顺利处理输入/删除操作。

这是问题的 gif

为了解决这个问题,我想将 TextInput 移动到一个单独的组件中(只有那个输入字段),然后将该组件添加到我的列表中。但是,我必须不断地将文本数据传回以过滤我的列表,从而增加了更多的复杂性。可能有更简单的解决方案吗?

javascript textinput keyboard-events reactjs react-native

5
推荐指数
1
解决办法
3454
查看次数