求助,C# 捕获组合键代码

cejay 2010-06-16 02:06:48
我正在写一个Form程序,现在为止就一个窗体,窗体里面有一个按钮,点击后触发“this.Hide()”【此程序主要在后台运行,前台界面的作用是修改配置】,
程序隐藏后我想当我按组合键Alt+Q时,隐藏的窗体显示出来。
自己鼓捣了半天钩子也没弄出个所以然来。特发帖求可行代码。

谢啦
...全文
286 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
windowsdraco 2010-11-18
  • 打赏
  • 举报
回复
11111
事理 2010-06-16
  • 打赏
  • 举报
回复
KeyboardHook keyboardHook = new KeyboardHook();//全局按键

public frmMonitor()
{
InitializeComponent();
keyboardHook.KeyDown += new KeyEventHandler(keyboardHook_KeyDown);
keyboardHook.Start();
}

结合上面即可完成,将GlobalHook.cs和KeyboardHook.cs复制到你的项目
事理 2010-06-16
  • 打赏
  • 举报
回复
//全局按键
void keyboardHook_KeyDown(object sender, KeyEventArgs e)
{
if (e.Alt&& e.KeyCode == Keys.Q)
{
}
}
可到http://download.csdn.net/source/2046112下载例子
cejay 2010-06-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 spmzfz 的回复:]

C# code

private RegisterHotKeyClass _RegisKey;
void _Regis_HotKey()
{
MessageBox.Show("You are pressed Alt + Q");

this.Show();
……
[/Quote]


哇,这么长,正在看,有些不明白
谢谢了
cejay 2010-06-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 spmzfz 的回复:]

以下代码我也是从CSDN 别人回答问题时拷贝过来的,按你的要求修改了一下,供你参考:

C# code

private void button7_Click(object sender, EventArgs e)
{
this.Hide();
if (_RegisKey != null) { retu……
[/Quote]

这个应该不行,这个就是写在按钮事件里去了,并不能后台捕获按键的
cejay 2010-06-16
  • 打赏
  • 举报
回复
谢谢楼上各位大侠了,这就试试
paradise1986 2010-06-16
  • 打赏
  • 举报
回复
顶大家一下!!
czjearth 2010-06-16
  • 打赏
  • 举报
回复
4楼的 good, 顶一下。
wuyq11 2010-06-16
  • 打赏
  • 举报
回复
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Control Or Keys.A: Button2_Click(sender, e); break;
case Keys.B: Button4_Click(sender, e); break;
default:break;
}
}
钩子函数
protected override void WndProc(ref Message m)
{
}
spmzfz 2010-06-16
  • 打赏
  • 举报
回复

private RegisterHotKeyClass _RegisKey;
void _Regis_HotKey()
{
MessageBox.Show("You are pressed Alt + Q");

this.Show();
//Do something
}
public class RegisterHotKeyClass
{
private IntPtr m_WindowHandle = IntPtr.Zero;
private MODKEY m_ModKey = MODKEY.MOD_CONTROL;
private Keys m_Keys = Keys.A;
private int m_WParam = 10000;
private bool Star = false;
private HotKeyWndProc m_HotKeyWnd = new HotKeyWndProc();

public IntPtr WindowHandle
{
get { return m_WindowHandle; }
set { if (Star)return; m_WindowHandle = value; }
}
public MODKEY ModKey
{
get { return m_ModKey; }
set { if (Star)return; m_ModKey = value; }
}
public Keys Keys
{
get { return m_Keys; }
set { if (Star)return; m_Keys = value; }
}
public int WParam
{
get { return m_WParam; }
set { if (Star)return; m_WParam = value; }
}

public void StarHotKey()
{
if (m_WindowHandle != IntPtr.Zero)
{
if (!RegisterHotKey(m_WindowHandle, m_WParam, m_ModKey, m_Keys))
{
throw new Exception("注册失败!");
}
try
{
m_HotKeyWnd.m_HotKeyPass = new HotKeyPass(KeyPass);
m_HotKeyWnd.m_WParam = m_WParam;
m_HotKeyWnd.AssignHandle(m_WindowHandle);
Star = true;
}
catch
{
StopHotKey();
}
}
}
private void KeyPass()
{
if (HotKey != null) HotKey();
}
public void StopHotKey()
{
if (Star)
{
if (!UnregisterHotKey(m_WindowHandle, m_WParam))
{
throw new Exception("卸载失败!");
}
Star = false;
m_HotKeyWnd.ReleaseHandle();
}
}


public delegate void HotKeyPass();
public event HotKeyPass HotKey;


private class HotKeyWndProc : NativeWindow
{
public int m_WParam = 10000;
public HotKeyPass m_HotKeyPass;
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0312 && m.WParam.ToInt32() == m_WParam)
{
if (m_HotKeyPass != null) m_HotKeyPass.Invoke();
}

base.WndProc(ref m);
}
}

public enum MODKEY
{
MOD_ALT = 0x0001,
MOD_CONTROL = 0x0002,
MOD_SHIFT = 0x0004,
MOD_WIN = 0x0008,
}

[DllImport("user32.dll")]
public static extern bool RegisterHotKey(IntPtr wnd, int id, MODKEY mode, Keys vk);

[DllImport("user32.dll")]
public static extern bool UnregisterHotKey(IntPtr wnd, int id);

}

spmzfz 2010-06-16
  • 打赏
  • 举报
回复
以下代码我也是从CSDN 别人回答问题时拷贝过来的,按你的要求修改了一下,供你参考:


private void button7_Click(object sender, EventArgs e)
{
this.Hide();
if (_RegisKey != null) { return; }

_RegisKey = new RegisterHotKeyClass();
_RegisKey.Keys = Keys.Q;
_RegisKey.ModKey = RegisterHotKeyClass.MODKEY.MOD_ALT;
_RegisKey.WindowHandle = this.Handle;
_RegisKey.HotKey += new RegisterHotKeyClass.HotKeyPass(_Regis_HotKey);
_RegisKey.StarHotKey();
}
cejay 2010-06-16
  • 打赏
  • 举报
回复
深夜无人来,自己顶一顶
spmzfz 2010-06-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 spmzfz 的回复:]
以下代码我也是从CSDN 别人回答问题时拷贝过来的,按你的要求修改了一下,供你参考:


C# code

private void button7_Click(object sender, EventArgs e)
{
this.Hide();
if (_RegisKey != null) {……
[/Quote]

这里是假设在 Button 里调用,后面的代码是放在和 button7_Click 同一级的IDE 窗口中,
代码是通过了的,没有错误。至于有些有些不明白,我也一样,你不要太在乎,等你C#技术高了,再回过头来看,里面使用了属性,事件,委托 ,API,重载等等。。。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧