标签: keyboard-events

如何从DataGridView数据单元获取keypressed,keydown事件

我需要在DataGridView控制单元格编辑期间接收按键事件.

根据我在网上找到的内容,DataGridView它旨在将所有关键事件传递DataGridView给单元格编辑控件,您无法轻松获取这些事件.

我发现这段代码会捕获这些事件以进行DataGrid控制,但这不起作用DataGridView.

.net datagridview keyboard-events

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

WPF:如何在Key*事件中检测Key重复?

注意:e.IsRepeat确认可行.存在的问题是因为我使用从Ubuntu到Windows的远程桌面.

我找到了此远程桌面问题的解决方法:

  1. 在Ubuntu中禁用密钥重复.
  2. 在主机Windows中:使用"打开重复键和慢键"启用FilterKeys
  3. 使用regedit转到 HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response
    1. AutoRepeatDelay,AutoRepeatRate, Last Valid Delay,Last Valid Repeat足够小.
    2. 禁用FilterKeys并重新启用以刷新注册表更改.

如何检测KeyUp/ KeyDown(或PreviewKeyDown/ PreviewKeyUp)事件中的密钥重复?

我有以下测试用例:

    public Window1() {
        InitializeComponent();

        this.KeyDown += new KeyEventHandler(Window1_KeyDown);
        this.KeyUp += new KeyEventHandler(Window1_KeyUp);
    }

    void Window1_KeyUp(object sender, KeyEventArgs e) {
        if (e.Key == Key.D) {
            Console.WriteLine("DOWN: key: {0}, rep{1}, togg{2}, dow{3}, up{4}", e.Key, e.IsRepeat, e.IsToggled, e.IsDown, e.IsUp);
        }
    }

    void Window1_KeyDown(object sender, KeyEventArgs e) …
Run Code Online (Sandbox Code Playgroud)

.net c# wpf keyboard-events .net-3.5

7
推荐指数
1
解决办法
5418
查看次数

在Linux下删除/重写/生成键盘事件

我想在Linux下交付,拦截并生成键盘(make/break)事件,然后才能将它们传送到任何应用程序.更准确地说,我想检测关键事件流中的模式,并能够根据检测到的模式丢弃/插入事件到流中.

我在SO上看过一些相关的问题,但是:

  • 或者他们只处理如何获得关键事件(关键记录器等),而不是如何操纵它们的传播(它们只是监听,但不拦截/生成).
  • 或者他们在X中使用被动/主动抓取(详见下文).

小型DSL

我解释下面的问题,但为了使它更紧凑和易懂,首先是一个小的DSL定义.

  • A_:用于制作(按)键A.
  • A^:用于中断(释放)键A.
  • A^->[C_,C^,U_,U^]:on A^为C发送一个make/break组合,然后在处理链中向下发送U(最后到应用程序).如果没有->则没有发送任何内容(但可能会修改内部状态以检测后续事件).
  • $X:执行任意操作.这可以发送一些可配置的键事件序列(可能类似于C-x C-semacs),或执行一个函数.如果我只能发送关键事件,那就足够了,因为我可以在窗口管理器中进一步处理这些事件,具体取决于哪个应用程序处于活动状态.

问题描述

好吧,所以使用这种表示法,这里是我想要检测的模式以及我想在处理链中传递的事件.

  1. A_, A^->[A_,A^]:探索.见上文,请注意发送A^.
  2. A_, B_, A^->[A_,A^], B^->[B_,B^]:基本上与1.相同但重叠事件不会改变处理流程.
  3. A_, B_, B^->[$X], A^:如果在保持另一个键(A)的同时完成了键(B)的完成/中断,则执行X(参见上文),并且丢弃A的中断.

(原则上,它是一个简单的状态机,可以在关键事件上实现,可以生成(多个)关键事件作为输出).

补充说明

  • 解决方案必须在打字速度上工作.
  • 修改后的密钥事件流的消费者在Linux上运行X(控制台,浏览器,编辑器等).
  • 只有键盘事件会影响处理(没有鼠标等)
  • 匹配可以发生匹配(更容易)或键码(更难一点).对于后者,我将只需要阅读映射以从代码转换为keysym.
  • 如果可能的话,我更喜欢适用于USB键盘以及虚拟机内部的解决方案(如果在驱动程序层工作则可能会出现问题,其他层应该没问题).
  • 我对实现语言非常开放.

可能的解决方案和问题

所以基本问题是如何实现这一点.

我已经在窗口管理器中使用被动grabs(XGrabKey)和实现了一个解决方案XSendEvent.不幸的是,被动抓取在这种情况下不起作用,因为它们B^在上面的第二种模式中没有正确捕获.原因是转换后的抓斗结束A^并且不继续B^.如果仍然保持,则新的抓取转换为捕获B,但仅在约1秒后.否则,将平原B^发送到应用程序.这可以通过验证xev.

我可以将我的实现转换为使用活动的grab(XGrabKeyboard),但是如果窗口管理器一直在键盘上有活跃的抓取,我不确定对其他应用程序的影响.X文档将活动抓取称为侵入式并且是为短期使用而设计的.如果有人有这方面的经验并且长期积极争夺没有重大缺点,那么我认为这是一个解决方案.

除了窗口管理器(作为X客户端运行)之外,我愿意查看其他关键事件处理层.键盘驱动程序或映射是可能的,只要我可以用它们解决上述问题.这也意味着解决方案不必是单独的应用程序.我很高兴有一个驱动程序或内核模块为我做这个.请注意,我从未做过任何内核或驱动程序编程,所以我会很感激一些好的资源.

感谢您的任何指示!

linux keyboard xlib keyboard-events linux-device-driver

7
推荐指数
1
解决办法
2690
查看次数

为什么SendKey.Send()只能偶尔使用一次?

我正在制作一个全局捕获键盘输入的Windows应用程序.当用户使用应用程序使用的CTRL + ALT + G快捷键组合时

SendKey.Send(Guid.NewGuid().ToString());
Run Code Online (Sandbox Code Playgroud)

在任何文本字段中键入生成的GUID.无论应用程序采取何种输入,它都应该这样做.

当你第一次键入CTRL + ALT + G时,它的工作方式与我的预期完全相同,但后续尝试不会产生任何结果,或者只是非常罕见的成功.

我的意思是,这一切都应该非常简单和一致.我有一个工作的全局键盘钩子,它一直工作,我已经测试过,但SendKey.Send()方法不是每次都有效.

我看过Google的任何与我的问题相关的内容,但到目前为止还没有任何工作.

有人有任何见解吗?

编辑1:我也尝试过使用SendKey.SendWait(),做同样的事情.我真的想要一种更灵敏的方式来使用这种键盘快捷方式生成新的GUID.

编辑2:

以下是代码的基本部分:

/* Initialization Code Here */
// register the event that is fired after the key press.
hook.KeyPressed += new EventHandler<KeyPressedEventArgs>(hook_KeyPressed);
// register the control + alt + F12 combination as hot key.
hook.RegisterHotKey((uint)(HotkeyModifiers.Control | HotkeyModifiers.Alt), Keys.G);
Run Code Online (Sandbox Code Playgroud)

事件代码非常简单:

void hook_KeyPressed(object sender, KeyPressedEventArgs e)
{
    SendKeys.SendWait(Guid.NewGuid().ToString());
}
Run Code Online (Sandbox Code Playgroud)

我项目中的其他任何事情都只是松懈.

更新1:

关于这个问题,我确实有更多的问题,但是今天我没有时间继续研究这个问题.我已经实现了Jon Raynor建议使用app.config方法取得一定程度的成功.一旦我解决了我的新问题,我将发布一个编辑,如果我的应用程序按预期运行,可能会关闭此问题.

.net c# keyboard-shortcuts keyboard-events

7
推荐指数
1
解决办法
4216
查看次数

为什么KeyUp和KeyDown事件变慢?

我在WPF窗口上使用KeyUpKeyDown事件.

我在这个窗口的CompositionTarget_Rendering事件中也有很多调用,它创建UIElements并为它们设置动画.这是由下面的引擎类完成的:

int _Fps;
Stopwatch sw = new Stopwatch();

void CompositionTarget_Rendering_Stats(object sender, EventArgs e)
{
    _Fps++;
    var ms = sw.ElapsedMilliseconds;
    sw.Restart();
    engine.Update(ms / 1000f);
    timeFrames.Add(ms);
}
Run Code Online (Sandbox Code Playgroud)

我注意到我拥有的元素越多,get KeyUpKeyDown事件越慢.

当我在主窗口中有大约1000个UI元素时,在我按下或释放一个键后,control_KeyDown和control_KeyUp的代码将在大约半秒后执行.

如果窗口内的动画也是滞后的话,这不会让我感到惊讶,但实际情况并非如此.

  • 帧速率约为55 fps
  • 动画保持流畅
  • CompositionTarget_Rendering事件中的计算持续时间不超过20毫秒.

似乎只有键盘事件轮询遭遇了沉重的条件.

我的问题是:

  • WPF中键盘处理背后的魔力是什么:为什么它在重度条件下变得迟钝而不是渲染过程?
  • 如何处理更好的键盘输入并避免这种情况?

编辑:

我写了一个受安迪评论启发的样本.您可以将其粘贴到新WPF应用程序的主窗口中.它会在键向下或向上时更改窗口的颜色,并在CompositionTarget_Rendering事件中填充尽可能多的文本框.

public partial class MainWindow : Window
{
    WrapPanel root2;

    public MainWindow()
    {
        InitializeComponent();
        root2 = new WrapPanel();
        root2.Margin = new Thickness(10);
        this.Content = root2;
    }

    private void Window_Loaded(object sender, RoutedEventArgs …
Run Code Online (Sandbox Code Playgroud)

wpf keyboard-events

7
推荐指数
1
解决办法
1505
查看次数

在扭曲的程序中中断raw_input

我将参考这个解释解决方法:

所以我要做的是:

def interrupted(signum, stackframe):
    log.warning('interrupted > Got signal: %s', signum)
    menu.quitMenu = True # to stop my code

signal.signal(signal.SIGINT, interrupted) # Handle KeyboardInterrupt
Run Code Online (Sandbox Code Playgroud)

问题是,虽然菜单被通知它必须停止,并且很快就会这样做,但它现在无法做到,因为它被困在raw_input:

def askUser(self):
    current_date   = datetime.now().isoformat(' ')
    choice = raw_input('%s > ' % current_date)
    return choice
Run Code Online (Sandbox Code Playgroud)

因此,由于twisted正在删除默认的中断处理程序,raw_input因此不会停止.我仍然需要按enter^C它停止.

如何强制raw_input停止,而不安装默认的中断处理程序,这是扭曲上下文中的问题来源(因为扭曲本身不会被期望中断)

我猜这个问题与之无关raw_input:任何采取无限时间(或超过预设限制)的函数都应该以某种方式中断.

这有可接受的扭曲模式吗?

编辑

这是完整的测试代码:

from datetime import datetime

class Menu:

    def __init__(self):
        self.quitMenu = False

    def showMenu(self):
        print '''

A) Do A …
Run Code Online (Sandbox Code Playgroud)

python twisted interrupt keyboard-events keyboardinterrupt

7
推荐指数
1
解决办法
916
查看次数

如何判断keydown是否会导致按键事件,在这种情况下会忽略它?

我对javascript中的关键事件不是很满意.我需要捕获两个字母用于写入(我正在写文本<canvas>)和功能键(转义)用于其他命令.

在Firefox中它可以工作,因为Firefox会keypress任何密钥触发事件.这很舒服,但规格直接允许它:

如果用户代理支持,当按下某个键时,必须调度此事件,当且仅当该键通常产生字符值时.

我不同意该规范,因为我认为没有理由.但就像现在一样,我无能为力.

问题是Google Chrome遵循该规范,并且不会触发keypress功能键.但是,它确实会对keydown所有按键点火.

我的程序只有一个键事件处理程序.它期望事件包含keyCode(物理键的ID和可选 charCode的等效字符值(对于有意义的键).

keydown事件在两个浏览器中都不包含任何字符值!它只包含keyCode.因此,如果您定义一个Ctrl+ Z组合并监听keydown事件,那么对于具有QWERTZ布局的用户,您的程序将被破坏 - 因为密钥(keyCode)的物理位置仍然相同.

如果你听两个keydownkeypress,性格事件将触发两次(怎么一回事,因为字符首先火灾keydown,然后keypress用适当的charCode属性)

我需要的?

基于以上所述,我需要忽略keydown将导致的键的事件keypress.这样做,我将能够捕捉到Esckeydown和字符keypress.

我怎么可能这样做?

相关代码:

  //Keypress for character codes
  div.addEventListener("keypress", function(event) {
    console.log(event); …
Run Code Online (Sandbox Code Playgroud)

javascript events keyboard-events

7
推荐指数
1
解决办法
1535
查看次数

AutoHotkey 中的功能键叫什么?

Fn我的 Windows 7 键盘底部有一个标有蓝色字母的按键。我想每当有人按下该键时就触发我的 AutoHotkey 脚本。

AutoHotkey 中的功能键叫什么?

autohotkey keyboard-events

7
推荐指数
1
解决办法
4426
查看次数

如何使用Mocha&Sinon测试document.addEventListener('keydown',cb)?

我正试图找出测试此方法的最佳方法:

document.addEventListener("keydown", function (event) {
    var modifiers = event.altKey || event.ctrlKey || event.metaKey ||
                    event.shiftKey;
    var mapped    = map[event.which];

    if (!modifiers) {
      if (mapped !== undefined) {
        event.preventDefault();
        self.emit("move", mapped);
      }
    }
  });
Run Code Online (Sandbox Code Playgroud)

我想确保如果键是修饰符或者键没有映射,则没有任何反应,但是,如果它们是,则监视self.emit函数.

javascript mocha.js keyboard-events dom-events sinon

7
推荐指数
1
解决办法
3659
查看次数

Vue v-model输入改变移动铬不起作用

如果我打开https://vuejs.org/v2/guide/forms.html#Text并编辑文本 - 对移动Chrome中的文本输入没有影响.@keyup @input @keypress - 当我打字时,v-model不会改变

<input v-model="message" @keyup="log" placeholder="Edit">
<p>Edited: {{ message }}</p>
Run Code Online (Sandbox Code Playgroud)

我该如何解决?我需要在输入时获得输入值(@keyup @input)

keyboard-events vue.js v-model

7
推荐指数
2
解决办法
3646
查看次数