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