C#中,给WinForm窗体中添加了几个按钮后就不会响应键盘事件了
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中,给WinForm窗体中添加了几个按钮后就不会响应键盘事件了相关的知识,希望对你有一定的参考价值。
当程序运行时,按键盘控制无效,但是几个按钮却又顺序''跳转''样(词穷了,⊙﹏⊙b汗),该怎么解决啊???
在窗体Keydown时间中写的代码,试过将窗体中属性Keypreview设置为true,也将按钮的Tabstop设置为false了,问题依然在啊!%>_<%
要解决这个问题,我记得好像在窗体的属性中有个keyprexxxxx(记不得单词了),把这个属性设置为true,就能解决你这个问题。追问
试过了,还是不行额,我是在窗体的Keydown事件中写的
追答我这里面有开发环境,还有一个属性是定义热键的,我忘了是什么名字,呵呵。你找找看,那个属性是可以定义组合热键(如ctrl+xxxxx,ctrl+shift+xxxx等)的,也可以单独指定按键。比较显眼。
参考技术A 当然了,你的到控件属性中双击键盘按下事件,然后在写代码,就可以了 参考技术B 设置按钮的TabStop属性为false 参考技术C 你代码应该不是机密吧?你代码贴上来我们也好看看追问如下
追答属性值KeyPreview 如果窗体将接收所有键事件,则为 true;如果窗体上当前选定控件接收键事件,则为 false。默认为 false 备注 当此属性设置为 true 时,窗体将接收所有 KeyPress、KeyDown 和 KeyUp 事件。在窗体的事件处理程序处理完该击键后,然后将该击键分配给具有焦点的控件。例如,如果 KeyPreview 属性设置为 true,而且当前选定的控件是 TextBox,则在该窗体的事件处理方法处理击键后,TextBox 控件将接收按下的键。要仅在窗体级别处理键盘事件并且不允许控件接收键盘事件,请将窗体的 KeyPress 事件处理方法中的 KeyPressEventArgs.Handled 属性设置为 true。 可以使用此属性处理应用程序中的所有的击键事件,并可以处理击键事件或调用适当的控件来处理击键事件。例如,当应用程序使用功能键时,可能希望在窗体级别处理这些击键,而不是为可能接收击键事件的每个控件编写代码。
本回答被提问者采纳WinForm中的几个实用技巧汇总
本文汇总了几个WinForm中常见的实用技巧,对于C#程序开发有着很好的参考借鉴价值。具体分析如下:
一、屏蔽窗体右上角关闭按钮
1.重写OnClosing
protected override void OnClosing(CancelEventArgs e) { if(this.Visible) { e.Cancel=true; // // WHATE TODO // } }
2.重写WndProc
protected override void WndProc(ref Message m) { const int WM_SYSCOMMAND = 0x0112; const int SC_CLOSE = 0xF060; if (m.Msg == WM_SYSCOMMAND && (int) m.WParam == SC_CLOSE) { // User clicked close button this.WindowState = FormWindowState.Minimized; return; } base.WndProc(ref m); }
更多方法可以参考:
二、屏蔽CTRL-V
在WinForm中的TextBox控件没有办法屏蔽CTRL-V的剪贴板粘贴动作,如果需要一个输入框,但是不希望用户粘贴剪贴板的内容,可以改用RichTextBox控件,并且在KeyDown中屏蔽掉CTRL-V键,例子:
private void richTextBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { if(e.Control && e.KeyCode==Keys.V) e.Handled = true; }
三、应用程序单例运行
#region 单实例运行 /// <summary> /// 单实例运行 /// </summary> /// <param name="frm">所要运行的主窗体</param> public static void SingleRun(Form frm) { System.Threading.Mutex mutex = new System.Threading.Mutex(false,"SINGLE_INSTANCE_MUTEX"); if (!mutex.WaitOne(0, false)) { mutex.Close(); mutex = null; } if (mutex != null) { Application.Run(frm); } else { MessageBox.Show("应用程序已启动","信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information); } } #endregion
四、将控件转换成圆形
#region 将控件转换为圆形 [System.Runtime.InteropServices.DllImport("gdi32")] private static extern IntPtr BeginPath(IntPtr hdc); [System.Runtime.InteropServices.DllImport("gdi32")] private static extern int SetBkMode(IntPtr hdc,int nBkMode); const int TRANSPARENT=1; [System.Runtime.InteropServices.DllImport("gdi32")] private static extern IntPtr EndPath(IntPtr hdc); [System.Runtime.InteropServices.DllImport("gdi32")] private static extern IntPtr PathToRegion(IntPtr hdc); [System.Runtime.InteropServices.DllImport("gdi32")] private static extern int Ellipse(IntPtr hdc,int x1,int y1,int x2,int y2); [System.Runtime.InteropServices.DllImport("user32")] private static extern IntPtr SetWindowRgn(IntPtr hwnd,IntPtr hRgn,bool bRedraw); [System.Runtime.InteropServices.DllImport("user32")] private static extern IntPtr GetDC(IntPtr hwnd); /// <summary> /// 将控件转为圆形 /// </summary> /// <param name="control">控件名</param> public static void MakeControlToCircle(Control[] control) { IntPtr dc; IntPtr region; for(int i=0;i<control.Length;i++) { dc=GetDC(control[i].Handle); BeginPath(dc); SetBkMode(dc,TRANSPARENT); Ellipse(dc,0,0,control[i].Width-3,control[i].Height-2); EndPath(dc); region=PathToRegion(dc); SetWindowRgn(control[i].Handle,region,false); } } #endregion
五、在同一应用程序中同一窗体只打开一个
/// <summary> /// 在同一应用程序中同一窗体只打开一个 /// </summary> /// <param name="frmOpen">要打开的窗体实例</param> /// <returns></returns> public static void OpenSeamForm(Form frmOpen) { foreach (Form frm in Application.OpenForms) { if (frm.Text == frmOpen.Text) { frm.Visible = true; frm.WindowState = FormWindowState.Normal; frm.Activate(); return; } } frmOpen.Show(); }
相信本文所述实例对大家WinForm程序设计可以带来很大帮助。
WinForm中的几个实用技巧汇总
本文地址: http://www.paobuke.com/develop/c-develop/pbk23601.html
相关内容
以上是关于C#中,给WinForm窗体中添加了几个按钮后就不会响应键盘事件了的主要内容,如果未能解决你的问题,请参考以下文章
C#中 怎样在Winform窗体 右上角最小化左边添加一个按钮 ?像Q2013登录界面那种设置的按钮?