如何让非焦点控件响应键盘按键?

时间:2023-02-20 09:26:00
程序界面上有一个panel,用来画画,画画用键盘控制。如果界面上没有其他控件,则form拥有焦点,我在form的keyDown里处理。当在界面上有其他可接受焦点的控件时,form则再也接收不到keydown事件了。这应该怎么办?

18 个解决方案

#1


参考窗体的 
ProcessKeyMessage
ProcessCmdKey
WndProc

#2


引用 1 楼 a523194491 的回复:
参考窗体的 
ProcessKeyMessage 
ProcessCmdKey 
WndProc
我是菜鸟,详细点好吗?

#3


非焦点的情况 好象做不到吧?

难道要焦点判断?

当textBox1 焦点的时候  textBox1 里面 将键盘的输入 记录 然后 写进  textBox2里面?

这样?   晕... 

我是小菜鸟!   说的不好清见谅,   希望能够帮到你!

#4


引用 3 楼 SuperTyro 的回复:
非焦点的情况 好象做不到吧? 

难道要焦点判断? 

当textBox1 焦点的时候  textBox1 里面 将键盘的输入 记录 然后 写进  textBox2里面? 

这样?  晕... 

我是小菜鸟!  说的不好清见谅,  希望能够帮到你!

不是这样的。是我说的不清楚吗?那来个实例吧: 在一个窗体上,有一个按钮和panel。要求点击按钮后,我按空格键或上下左右键后,panel上都给我画出一个矩形。
请考虑,如果我的窗体上不止一个按钮,还有几个textBox,你的方法的适用吗。

#5


在其它控件上处理特殊的事件.

#6



private void button1_Click(object sender, EventArgs e)
{
.......................
panel1.Focus();
}

#7


1.监视form_keypress事件,响应控件事件
2.监视prowmc事件
3.可以挂钩子

#8


6楼的,Focus()方法根本不行。我早就试过了。
7楼的,你说的prowmcGoogle都搜不到相关信息,让我这菜鸟怎么用?

能不能详细一点?

#9


关注下   
up

#10


搜一下WINAPI消息,或钩子函数。

#11


求代码~

up

#12


学习一下,感觉用控件的响应键盘事件好像解决不了这个问题,因为无法知道到底有多少个控件,且需要为每个控件写代码,应该是要直接拦截键盘消息吧

#13


好啊,直接拦截。请教一下怎么拦截?

#14


路过,学习!!!!!!!!!!!!!!!!!

#15


画的时候把其他空间enable=false掉 是我以前找到的一个比较苯的办法 暂时还没找到更好的 如果这个办法不影响你的程序 可以试试

panel的 tabindex改成0 试下 我临时想到的 没试过


关注此贴  我也想找到更好的办法

#16


画的时候把其他空间enable=false掉 是我以前找到的一个比较苯的办法 暂时还没找到更好的 如果这个办法不影响你的程序 可以试试

panel的 tabindex改成0 试下 我临时想到的 没试过


关注此贴  我也想找到更好的办法

#17


bool blnStartDraw = false;
private void button1_Click(object sender, System.EventArgs e)
{
blnStartDraw = true;
}

private void button2_Click(object sender, System.EventArgs e)
{
blnStartDraw = false;
}

const int WM_KEYDOWN  = 0x100;

protected override bool ProcessCmdKey(
ref Message msg,
Keys keyData
)
{
if (msg.Msg == WM_KEYDOWN) 
{
if (blnStartDraw == true)
{
Graphics g = this.panel1.CreateGraphics();
g.DrawRectangle(System.Drawing.Pens.Red, 10, 10, 100, 100);
g.Dispose();
return true;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}

#18


谢谢了,正是我想要的!

#1


参考窗体的 
ProcessKeyMessage
ProcessCmdKey
WndProc

#2


引用 1 楼 a523194491 的回复:
参考窗体的 
ProcessKeyMessage 
ProcessCmdKey 
WndProc
我是菜鸟,详细点好吗?

#3


非焦点的情况 好象做不到吧?

难道要焦点判断?

当textBox1 焦点的时候  textBox1 里面 将键盘的输入 记录 然后 写进  textBox2里面?

这样?   晕... 

我是小菜鸟!   说的不好清见谅,   希望能够帮到你!

#4


引用 3 楼 SuperTyro 的回复:
非焦点的情况 好象做不到吧? 

难道要焦点判断? 

当textBox1 焦点的时候  textBox1 里面 将键盘的输入 记录 然后 写进  textBox2里面? 

这样?  晕... 

我是小菜鸟!  说的不好清见谅,  希望能够帮到你!

不是这样的。是我说的不清楚吗?那来个实例吧: 在一个窗体上,有一个按钮和panel。要求点击按钮后,我按空格键或上下左右键后,panel上都给我画出一个矩形。
请考虑,如果我的窗体上不止一个按钮,还有几个textBox,你的方法的适用吗。

#5


在其它控件上处理特殊的事件.

#6



private void button1_Click(object sender, EventArgs e)
{
.......................
panel1.Focus();
}

#7


1.监视form_keypress事件,响应控件事件
2.监视prowmc事件
3.可以挂钩子

#8


6楼的,Focus()方法根本不行。我早就试过了。
7楼的,你说的prowmcGoogle都搜不到相关信息,让我这菜鸟怎么用?

能不能详细一点?

#9


关注下   
up

#10


搜一下WINAPI消息,或钩子函数。

#11


求代码~

up

#12


学习一下,感觉用控件的响应键盘事件好像解决不了这个问题,因为无法知道到底有多少个控件,且需要为每个控件写代码,应该是要直接拦截键盘消息吧

#13


好啊,直接拦截。请教一下怎么拦截?

#14


路过,学习!!!!!!!!!!!!!!!!!

#15


画的时候把其他空间enable=false掉 是我以前找到的一个比较苯的办法 暂时还没找到更好的 如果这个办法不影响你的程序 可以试试

panel的 tabindex改成0 试下 我临时想到的 没试过


关注此贴  我也想找到更好的办法

#16


画的时候把其他空间enable=false掉 是我以前找到的一个比较苯的办法 暂时还没找到更好的 如果这个办法不影响你的程序 可以试试

panel的 tabindex改成0 试下 我临时想到的 没试过


关注此贴  我也想找到更好的办法

#17


bool blnStartDraw = false;
private void button1_Click(object sender, System.EventArgs e)
{
blnStartDraw = true;
}

private void button2_Click(object sender, System.EventArgs e)
{
blnStartDraw = false;
}

const int WM_KEYDOWN  = 0x100;

protected override bool ProcessCmdKey(
ref Message msg,
Keys keyData
)
{
if (msg.Msg == WM_KEYDOWN) 
{
if (blnStartDraw == true)
{
Graphics g = this.panel1.CreateGraphics();
g.DrawRectangle(System.Drawing.Pens.Red, 10, 10, 100, 100);
g.Dispose();
return true;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}

#18


谢谢了,正是我想要的!