private void StopButton()
{
foreach (Control ctr in panel1.Controls)
{
//ctr.KeyPress+=new KeyPressEventHandler(ctr_KeyPress);
ctr.KeyDown+=new KeyEventHandler(ctr_KeyDown);
}
}
private void ctr_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Space)
{
e.Handled = false;
}
}
private void ctr_KeyPress(object sender,KeyPressEventArgs e)
{
if (e.KeyChar == 32)
{
e.Handled = true;
}
}
{
foreach (Control ctr in panel1.Controls)
{
//ctr.KeyPress+=new KeyPressEventHandler(ctr_KeyPress);
ctr.KeyDown+=new KeyEventHandler(ctr_KeyDown);
}
}
private void ctr_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Space)
{
e.Handled = false;
}
}
private void ctr_KeyPress(object sender,KeyPressEventArgs e)
{
if (e.KeyChar == 32)
{
e.Handled = true;
}
}
{
if (e.KeyCode == Keys.Space)//当输入键为空格的时候
{
e.Handled = false;这块有办法吗??我不知道怎么禁用
}
}
我 对你无语,你明白焦点吗?你想给那个控件禁用空格键?btn?还是panel
我 对你无语,你明白焦点吗?你想给那个控件禁用空格键?btn?还是panelbutton,将button的空格键禁用,因为button的设置有一个当获取到焦点的时候,按空格,回车键将触发button的click事件所以我不知道你说的焦点是什么意思
{
button btn = con as button;
if btn != null
btn.keypress+=btn_BtnKeypress;
}
{
button btn = con as button;
if btn != null
btn.keypress+=btn_BtnKeypress;
}。。看不懂
{
button btn = con as button;
if btn != null
btn.keypress+=btn_BtnKeypress;
}。。看不懂
给button添加keypress事件,之后再这个事件里写禁用空格的代码
void btn_BtnKeyPress(object s ,keyeventarges e)
if e.keycode == 空格
e.handel = true
private void ctr_KeyPress(object sender,KeyPressEventArgs e)
{
if (e.KeyChar == 32)
{
e.Handled = true;
}
}大哥,你看是我这个不,我用过了唉
if e.keycode == 空格
e.handel = true
大哥,你if没有()???keyPress的方法不能用keyeventargs只能用keyPressEventArgs..然后e的对象调用之后handled没有handel。你这个代码我根本调用不了啊。。
private void ctr_KeyPress(object sender,KeyPressEventArgs e)
{
if (e.KeyChar == 32)
{
MessageBox.Show("估计不会响应click事件了!");
}
}
猜测而已。测试一下吧
if e.keycode == 空格
e.handel = true
大哥,你if没有()???keyPress的方法不能用keyeventargs只能用keyPressEventArgs..然后e的对象调用之后handled没有handel。你这个代码我根本调用不了啊。。
不好意思,刚才试了一下 不好用,不好意思啊 兄弟
CSDN下有完整的DEMO下载
private void ctr_KeyPress(object sender,KeyPressEventArgs e)
{
if (e.KeyChar == 32)
{
MessageBox.Show("估计不会响应click事件了!");
}
}
猜测而已。测试一下吧我试过这个,然后会出来
{
if (e.KeyChar == 32)
{
e.Handled = true;
}
}
我就是这么写的,只是 e.Handled = true;这个位置的不会写了。
private void ctr_KeyPress(object sender,KeyPressEventArgs e)
{
if (e.KeyChar == 32)
{
MessageBox.Show("估计不会响应click事件了!");
}
}
猜测而已。测试一下吧我试过这个,然后会出来
这样就不会响应 click 事件。 所以你需要 另一个事件 来中断 程序默认响应的click事件
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using hook;
namespace hook
{
public partial class Form1 : Form
{
private hook.KeyboardHookLib _keyboardHook = null; public Form1()
{
InitializeComponent();
} int num = 0;
private void button1_Click(object sender, EventArgs e)
{
//安装勾子
_keyboardHook = new hook.KeyboardHookLib();
_keyboardHook.InstallHook(this.OnKeyPress);
}
private void button2_Click(object sender, EventArgs e)
{
//取消勾子
if (_keyboardHook != null) _keyboardHook.UninstallHook();
}
/// <summary>
/// 客户端键盘捕捉事件.
/// </summary>
/// <param name="hookStruct">由Hook程序发送的按键信息</param>
/// <param name="handle">是否拦截</param>
public void OnKeyPress(hook.KeyboardHookLib.HookStruct hookStruct, out bool handle)
{
handle = false; //预设不拦截任何键
if (hookStruct.vkCode == 91) // 截获左win(开始菜单键)
{
handle = true;
}
if (hookStruct.vkCode == 92)// 截获右win
{
handle = true;
}
//截获Ctrl+Esc
if (hookStruct.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control)
{
handle = true;
}
//截获alt+f4
if (hookStruct.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys.Alt)
{
handle = true;
}
//截获alt+tab
if (hookStruct.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys.Alt)
{
handle = true;
}
//截获F1
if (hookStruct.vkCode == (int)Keys.F1)
{
handle = true;
}
//截获Ctrl+Alt+Delete
if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt + (int)Keys.Delete)
{
handle = true;
}
//如果键A~Z
if (hookStruct.vkCode >= (int)Keys.A && hookStruct.vkCode <= (int)Keys.Z)
{
//挡掉B键
if (hookStruct.vkCode == (int)Keys.B)
hookStruct.vkCode = (int)Keys.None; //设键为0
handle = true;
}
Keys key = (Keys)hookStruct.vkCode;
num++;
label1.Text = "你按下:" + (key == Keys.None ? "" : key.ToString())+" 按下次数是:"+num.ToString();
}
}
}using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Diagnostics;
using Microsoft.Win32;
using System.Windows.Forms; namespace hook
{
/// <summary>
/// 键盘Hook管理类, by www.vjsdn.com 易学原创
/// </summary>
public class KeyboardHookLib
{
private const int WH_KEYBOARD_LL = 13; //键盘
//键盘处理事件委托 ,当捕获键盘输入时调用定义该委托的方法.
private delegate int HookHandle(int nCode, int wParam, IntPtr lParam);
//客户端键盘处理事件
public delegate void ProcessKeyHandle(HookStruct param, out bool handle);
//接收SetWindowsHookEx返回值
private static int _hHookValue = 0;
//勾子程序处理事件
private HookHandle _KeyBoardHookProcedure;
//Hook结构
[StructLayout(LayoutKind.Sequential)]
public class HookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
//设置钩子
[DllImport("user32.dll")]
private static extern int SetWindowsHookEx(int idHook, HookHandle lpfn, IntPtr hInstance, int threadId);
//取消钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern bool UnhookWindowsHookEx(int idHook);
//调用下一个钩子
[DllImport("user32.dll")]
private static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);
//获取当前线程ID
[DllImport("kernel32.dll")]
private static extern int GetCurrentThreadId();
//Gets the main module for the associated process.
[DllImport("kernel32.dll")]
private static extern IntPtr GetModuleHandle(string name);
private IntPtr _hookWindowPtr = IntPtr.Zero;
//构造器
public KeyboardHookLib() { }
//外部调用的键盘处理事件
private static ProcessKeyHandle _clientMethod = null;
/// <summary>
/// 安装勾子
/// </summary>
/// <param name="hookProcess">外部调用的键盘处理事件</param>
public void InstallHook(ProcessKeyHandle clientMethod)
{
_clientMethod = clientMethod;
// 安装键盘钩子
if (_hHookValue == 0)
{
_KeyBoardHookProcedure = new HookHandle(OnHookProc);
_hookWindowPtr = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
_hHookValue = SetWindowsHookEx(
WH_KEYBOARD_LL,
_KeyBoardHookProcedure,
_hookWindowPtr,
0);
//如果设置钩子失败.
if (_hHookValue == 0) UninstallHook();
}
}
//取消钩子事件
public void UninstallHook()
{
if (_hHookValue != 0)
{
bool ret = UnhookWindowsHookEx(_hHookValue);
if (ret) _hHookValue = 0;
}
}
//钩子事件内部调用,调用_clientMethod方法转发到客户端应用。
private static int OnHookProc(int nCode, int wParam, IntPtr lParam)
{
if (nCode >= 0)
{
//转换结构
HookStruct hookStruct = (HookStruct)Marshal.PtrToStructure(lParam, typeof(HookStruct));
if (_clientMethod != null)
{
bool handle = false;
//调用客户提供的事件处理程序。
_clientMethod(hookStruct, out handle);
if (handle) return 1; //1:表示拦截键盘,return 退出
}
}
return CallNextHookEx(_hHookValue, nCode, wParam, lParam);
}
}
}
//如果其他的窗口输入的东西都被截止了,只要将OnKeyPress()事件中所有的截获操作注释掉,就可以正常使用了。
{
if (index == 0) //等于0的时候 就执行
{
MessageBox.Show("这里是要执行的函数");
}
else
{
abc--;
}
}
/*当时空格键 发出指令,就将index的值+1,反正默认还是会执行button_click事件
*到那个时候index =1 。所以只能执行else里面的语句 自然又将值还原成为0.
*而鼠标点击的时候 index的值没有改变所以就会一直为0;是0的话 就执行! */
private void button1_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Space)
{
index ++;
}
}
{
if (index == 0) //等于0的时候 就执行
{
MessageBox.Show("这里是要执行的函数");
}
else
{
abc--;
}
}
/*当时空格键 发出指令,就将index的值+1,反正默认还是会执行button_click事件
*到那个时候index =1 。所以只能执行else里面的语句 自然又将值还原成为0.
*而鼠标点击的时候 index的值没有改变所以就会一直为0;是0的话 就执行! */
private void button1_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Space)
{
index ++;
}
}这个方法真没想过,一直想改系统定义的
{
if (index == 0) //等于0的时候 就执行
{
MessageBox.Show("这里是要执行的函数");
}
else
{
abc--;
}
}
/*当时空格键 发出指令,就将index的值+1,反正默认还是会执行button_click事件
*到那个时候index =1 。所以只能执行else里面的语句 自然又将值还原成为0.
*而鼠标点击的时候 index的值没有改变所以就会一直为0;是0的话 就执行! */
private void button1_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Space)
{
index ++;
}
}这个方法真没想过,一直想改系统定义的
protected override void DefWndProc
{
foreach (Control ctr in panel1.Controls)
{
ctr.KeyPress+=new KeyPressEventHandler(ctr_KeyPress);
//ctr.KeyDown+=new KeyEventHandler(ctr_KeyDown);
//ctr.onKeyPress();
}
}
private void ctr_KeyDown(object sender, KeyEventArgs e)
{
space = false;
if (e.KeyCode == Keys.Space)
{
space = true;
}
}
private void ctr_KeyPress(object sender,KeyPressEventArgs e)
{
space = false;
if (e.KeyChar == 32)
{
space = true;
}
}
出现一个bug不知道你遇到过没,按了空格之后禁用了,结果我再按回车键盘没反应,要按好几次之后才有反应,或者按下26位字母之后,就好了。。先谢了,一个下午就是忘了加个标志位,郁闷,呵呵
其实问题是触发事件不触发了(也就是不响应了),按按钮的时候不触发这个函数了。怪异。