Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我按下Alt键时,如何防止控制框获得焦点?_C#_Winforms - Fatal编程技术网

C# 当我按下Alt键时,如何防止控制框获得焦点?

C# 当我按下Alt键时,如何防止控制框获得焦点?,c#,winforms,C#,Winforms,在我的应用程序中,我希望用户能够按住Alt键对鼠标动作进行某些修改。与使用鼠标滚轮时垂直滚动不同,按住Alt键时视图将水平滚动 这很有效,但在释放Alt后,我的控件不再具有焦点。当我按下空格键时,我就知道为什么了。由于我按了Alt键,窗口菜单获得了焦点 如何防止这种情况发生?在释放Alt手势后,通过调用control.focus以编程方式强制控件具有焦点 为什么这个黑客可以接受?因为此行为仅限于控件具有焦点且手势已成功处理的实例 释放Alt手势后,通过调用control.focus以编程方式强制

在我的应用程序中,我希望用户能够按住Alt键对鼠标动作进行某些修改。与使用鼠标滚轮时垂直滚动不同,按住Alt键时视图将水平滚动

这很有效,但在释放Alt后,我的控件不再具有焦点。当我按下空格键时,我就知道为什么了。由于我按了Alt键,窗口菜单获得了焦点


如何防止这种情况发生?

在释放Alt手势后,通过调用control.focus以编程方式强制控件具有焦点


为什么这个黑客可以接受?因为此行为仅限于控件具有焦点且手势已成功处理的实例

释放Alt手势后,通过调用control.focus以编程方式强制控件具有焦点


为什么这个黑客可以接受?因为此行为仅限于控件具有焦点且手势已成功处理的实例

我认为您需要在键盘上注册事件并将事件标记为已处理, 我的意思不是按键,甚至不是向下键。。。
我的意思是在PreviewKeydown上不要记住确切的名称,但谷歌搜索可以

我想你需要在键盘上注册事件,并将事件标记为已处理, 我的意思不是按键,甚至不是向下键。。。
我的意思是在PreviewKeyDown上不要记住确切的名称,但谷歌搜索可以解决这个问题。要解决这个问题并不容易,需要防止WM_SYSKEYDOWN消息到达默认窗口过程。只有在它到达具有焦点的控件之前对其进行过滤,这才是切实可行的。这可以通过让表单实现IMessageFilter接口来实现。像这样:

public partial class Form1 : Form, IMessageFilter {
    public Form1() {
        InitializeComponent();
        Application.AddMessageFilter(this);
    }
    protected override void OnFormClosed(FormClosedEventArgs e) {
        Application.RemoveMessageFilter(this);
        base.OnFormClosed(e);
    }
    public bool PreFilterMessage(ref Message m) {
        // Trap WM_SYSKEYUPDOWN message for the ALT key
        if ((Keys)m.WParam.ToInt32() == Keys.Menu) {
            if (m.Msg == 0x104) { AltKeyPressed = true; return true; }
            if (m.Msg == 0x105) { AltKeyPressed = false; return true; }
        }
        return false;
    }
    private bool AltKeyPressed;
}

当心许多副作用,它会阻止菜单正常运行,使用Alt键的快捷键将不再起作用。请考虑使用Ctrl或Shift代替.< /P> < P>修复这不容易,需要防止WMySysKEYDOWN消息到达默认窗口过程。只有在它到达具有焦点的控件之前对其进行过滤,这才是切实可行的。这可以通过让表单实现IMessageFilter接口来实现。像这样:

public partial class Form1 : Form, IMessageFilter {
    public Form1() {
        InitializeComponent();
        Application.AddMessageFilter(this);
    }
    protected override void OnFormClosed(FormClosedEventArgs e) {
        Application.RemoveMessageFilter(this);
        base.OnFormClosed(e);
    }
    public bool PreFilterMessage(ref Message m) {
        // Trap WM_SYSKEYUPDOWN message for the ALT key
        if ((Keys)m.WParam.ToInt32() == Keys.Menu) {
            if (m.Msg == 0x104) { AltKeyPressed = true; return true; }
            if (m.Msg == 0x105) { AltKeyPressed = false; return true; }
        }
        return false;
    }
    private bool AltKeyPressed;
}

当心许多副作用,它会阻止菜单正常运行,使用Alt键的快捷键将不再起作用。请考虑使用Ctrl或Shift代替。

我今天学习了KBD标签。@拉盖特:它非常流行;我今天学了kbd标签。@rageit:在电视上很流行;是的,我曾经在构建网格控件时使用过它。。。当您将事件标记为已处理时。Hans展示了一种更高级的方法,通过在消息循环中切换来忽略此按键按下消息。鉴于“副作用”的数量“很多”,如前所述,我会暂停,然后再将其称为更高级。是的,我在构建网格控件时使用过一次。。。当您将事件标记为已处理时。Hans展示了一种更高级的方法,通过在消息循环中切换来忽略此按键按下消息。鉴于“副作用”的数量“很多”,如前所述,我会暂停,然后再调用它更高级。太棒了。这很有魅力。我甚至可以直接在我想要的控件中实现这个行为。我试图在这段代码中模拟Photoshop的行为,Alt+Wheel缩放画布,这就是为什么我没有选择Ctrl或Shift。然而,这是一个需要此功能的控件,我担心由于可移植性可能产生的副作用。我看看我会怎么处理:太棒了。这很有魅力。我甚至可以直接在我想要的控件中实现这个行为。我试图在这段代码中模拟Photoshop的行为,Alt+Wheel缩放画布,这就是为什么我没有选择Ctrl或Shift。然而,这是一个需要此功能的控件,我担心由于可移植性可能产生的副作用。我来看看我会怎么处理: