wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了.NET的SuppressKeypress是如何工作的?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

[这个问题是WinAPI编程的核心] 在.NET术语中: 当Keydown事件在WinForms中触发时,您可以设置KeyEventArgs.SuppressKeypress = true,然后不将后续的Keypress / Character发送给控件. 我找到了以下SO答案,详细说明了Control如何做到: Using SuppressKeyPress event to block a Ke
[这个问题是WinAPI编程的核心]

在.NET术语中:

当Keydown事件在WinForms中触发时,您可以设置KeyEventArgs.SuppressKeypress = true,然后不将后续的Keypress / Character发送给控件.

我找到了以下SO答案,详细说明了Control如何做到:
Using SuppressKeyPress event to block a KeyUp event

但现在我不明白,这怎么能正常工作?如果程序在其队列中构建了几个keydown消息,并且你通过的前几个消息会发生什么,但是最后一个你使用上面的方法抑制,那么RemovePendingmessages函数不会从队列中删除所有字符,而不仅仅是最后一个

在Windows API术语中:

一个典型的消息循环,它调用Translatemessage从键盘输入中获取WM_CHAR消息.在WM_KEYDOWN上检查密钥是否被识别为命令,在这种情况下它不应生成字符.如何去除可能发布到消息队列的WM_CHAR消息以有效地抑制按键? .NET中的现有解决方案似乎使用循环Peekmessage(..,WM_CHAR,PM_REMOVE)从队列中删除所有字符,但如果队列中有多个keydown消息,则不会删除太多字符吗?

解决方法

你的直觉是正确的,事实上它确实是你所描述的行为不端.一些代码可以看到这个错误

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }
    int keycnt = 0;

    protected override void OnKeyDown(KeyEventArgs E) {
        keycnt++;
        if (keycnt == 3) e.SuppressKeyPress = true;
        base.onKeyDown(E);
    }
    protected override void OnKeyPress(KeyPressEventArgs E) {
        Debug.Print("Press {0}",e.KeyChar);
        base.onKeyPress(E);
    }
    protected override void WndProc(ref message m) {
        if (m.Msg >= 0x100 && m.Msg <= 0x109) Debug.WriteLine(m);
        base.WndProc(ref m);
    }

    [System.Runtime.Interopservices.DllImport("user32.dll")]
    private static extern IntPtr Postmessage(IntPtr hwnd,int msg,IntPtr wp,IntPtr lp);

    protected override void OnMouseClick(MouseEventArgs E) {
        for (int ix = 0; ix < 5; ++iX) {
            Postmessage(this.Handle,0x100,(IntPtr)Keys.A,IntPtr.Zero);
        }
    }
}

单击表单以触发测试.请注意OnKeyDown如何仅抑制第3次击键.但只有前2个通过,其余的吞下去.

我从来没有见过有人抱怨过这个.

大佬总结

以上是大佬教程为你收集整理的.NET的SuppressKeypress是如何工作的?全部内容,希望文章能够帮你解决.NET的SuppressKeypress是如何工作的?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:如何工作