后面那篇文章也不错。 我整理了一下放两段代码出来:首先是一个静态类,里面处理与HotKey有关的函数,这个基本上是原文复制。只修改了一些访问限制符。 using System; using System.Runtime.InteropServices; using System.Windows.Forms;namespace WTest26 { public static class HotKey { [DllImport("user32.dll")] private static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk); [DllImport("user32.dll")] private static extern int UnregisterHotKey(IntPtr hwnd, int id); public const int WM_HOTKEY = 0x312; //窗口消息-热键 public const int WM_CREATE = 0x1; //窗口消息-创建 public const int WM_DESTROY = 0x2; //窗口消息-销毁 public const int MOD_ALT = 0x1; //ALT public const int MOD_CONTROL = 0x2; //CTRL public const int MOD_SHIFT = 0x4; //SHIFT public const int VK_SPACE = 0x20; //SPACE /// <summary> /// 注册热键 /// </summary> /// <param name="hwnd">窗口句柄</param> /// <param name="hotKey_id">热键ID</param> /// <param name="fsModifiers">组合键</param> /// <param name="vk">热键</param> public static void RegKey(IntPtr hwnd, int hotKey_id, int fsModifiers, int vk) { bool result; if (RegisterHotKey(hwnd, hotKey_id, fsModifiers, vk) == 0) { result = false; } else { result = true; } if (!result) { MessageBox.Show("注册热键失败!"); } } /// <summary> /// 注销热键 /// </summary> /// <param name="hwnd">窗口句柄</param> /// <param name="hotKey_id">热键ID</param> public static void UnRegKey(IntPtr hwnd, int hotKey_id) { UnregisterHotKey(hwnd, hotKey_id); } } }
然后是程序部分如何使用的代码了,按你的要求。Ctrl+F1,Ctrl+F2。 不过一定要注意理解注册时使用的4个参数的根据。 后面两个参数好理解一个是Ctrl,Shift,Alt这些功能键是否处理,一个是按下的其它非功能键,比如ABCD之类的。 对于注册时使用的第1个参数,handler这是你用于接收热键消息的窗口句柄,这个固定。 第2个参数是热键的编号,它不一定要等于你要注册的热键的VK码,可以是其它值,只要不与现有的热键编号相同或者冲突即可。否则会导致已有的热键不可用。具体的你可以去查MSDN。 using System; using System.Diagnostics; using System.Windows.Forms; using System.Web;namespace WTest26 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private const int VK_F1 = 112; private const int VK_F2 = 113; protected override void WndProc(ref Message m) { base.WndProc(ref m); switch (m.Msg) { case HotKey.WM_HOTKEY: //窗口消息-热键 switch (m.WParam.ToInt32()) { case VK_F1: //隐藏热键ID this.Hide(); break; case VK_F2: //显示热键ID this.Show(); break; default: break; } break; case HotKey.WM_CREATE: //窗口消息-创建 //注册Ctrl+F1 HotKey.RegKey(Handle, VK_F1, HotKey.MOD_CONTROL, VK_F1); HotKey.RegKey(Handle, VK_F2, HotKey.MOD_CONTROL, VK_F2); break; case HotKey.WM_DESTROY: //窗口消息-销毁 HotKey.UnRegKey(Handle, VK_F1); HotKey.UnRegKey(Handle, VK_F2); break; default: break; } } }
private const int VK_F1 = 112; private const int VK_F2 = 113; 问题已经解决.但偶还想知道:ctrl + F1 的键值 怎么是112,ctrl +F2 的键值 113, 这个结果是怎么来的? 如果是 shift +ctrl + F1 ,键值又是多少.先把帖子结了!
可以隐藏任意程序的窗口,至少我还没遇到过不能隐藏的。
至于你说的这个:
1:注册全局热键;
2:在热键中隐藏你所有的程序窗口;
弄程序实现当然最好了啊.呵呵
up.
http://blog.csdn.net/s4gg/archive/2008/09/24/2974812.aspx
.但许多地方不是很理解.....慢慢看下去...
我整理了一下放两段代码出来:首先是一个静态类,里面处理与HotKey有关的函数,这个基本上是原文复制。只修改了一些访问限制符。
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;namespace WTest26
{
public static class HotKey
{
[DllImport("user32.dll")]
private static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk);
[DllImport("user32.dll")]
private static extern int UnregisterHotKey(IntPtr hwnd, int id); public const int WM_HOTKEY = 0x312; //窗口消息-热键
public const int WM_CREATE = 0x1; //窗口消息-创建
public const int WM_DESTROY = 0x2; //窗口消息-销毁
public const int MOD_ALT = 0x1; //ALT
public const int MOD_CONTROL = 0x2; //CTRL
public const int MOD_SHIFT = 0x4; //SHIFT
public const int VK_SPACE = 0x20; //SPACE /// <summary>
/// 注册热键
/// </summary>
/// <param name="hwnd">窗口句柄</param>
/// <param name="hotKey_id">热键ID</param>
/// <param name="fsModifiers">组合键</param>
/// <param name="vk">热键</param>
public static void RegKey(IntPtr hwnd, int hotKey_id, int fsModifiers, int vk)
{
bool result;
if (RegisterHotKey(hwnd, hotKey_id, fsModifiers, vk) == 0)
{
result = false;
}
else
{
result = true;
}
if (!result)
{
MessageBox.Show("注册热键失败!");
}
} /// <summary>
/// 注销热键
/// </summary>
/// <param name="hwnd">窗口句柄</param>
/// <param name="hotKey_id">热键ID</param>
public static void UnRegKey(IntPtr hwnd, int hotKey_id)
{
UnregisterHotKey(hwnd, hotKey_id);
}
}
}
不过一定要注意理解注册时使用的4个参数的根据。
后面两个参数好理解一个是Ctrl,Shift,Alt这些功能键是否处理,一个是按下的其它非功能键,比如ABCD之类的。
对于注册时使用的第1个参数,handler这是你用于接收热键消息的窗口句柄,这个固定。
第2个参数是热键的编号,它不一定要等于你要注册的热键的VK码,可以是其它值,只要不与现有的热键编号相同或者冲突即可。否则会导致已有的热键不可用。具体的你可以去查MSDN。
using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Web;namespace WTest26
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private const int VK_F1 = 112;
private const int VK_F2 = 113; protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case HotKey.WM_HOTKEY: //窗口消息-热键
switch (m.WParam.ToInt32())
{
case VK_F1: //隐藏热键ID
this.Hide();
break;
case VK_F2: //显示热键ID
this.Show();
break;
default:
break;
}
break;
case HotKey.WM_CREATE: //窗口消息-创建
//注册Ctrl+F1
HotKey.RegKey(Handle, VK_F1, HotKey.MOD_CONTROL, VK_F1);
HotKey.RegKey(Handle, VK_F2, HotKey.MOD_CONTROL, VK_F2);
break;
case HotKey.WM_DESTROY: //窗口消息-销毁
HotKey.UnRegKey(Handle, VK_F1);
HotKey.UnRegKey(Handle, VK_F2);
break;
default:
break;
}
}
}
private const int VK_F2 = 113;
问题已经解决.但偶还想知道:ctrl + F1 的键值 怎么是112,ctrl +F2 的键值 113,
这个结果是怎么来的?
如果是 shift +ctrl + F1 ,键值又是多少.先把帖子结了!
VK_F1 = 112;并不是Ctrl+F1的键值,而是F1的VK(VirtualKey)值.这个值是固定的(具体的内容可以查MSDN,我发的链接中的后面那个地址中也有).Ctrl,Shift,Alt这些功能键也有键值,但在这里不需要考虑.因此从你那的编码的角度,如果你要用shift+ctrl+F1,你需要这样调用:HotKey.RegKey(Handle, VK_F1, HotKey.MOD_CONTROL|HotKey.Mod_SHIFT,VK_F1);最后面那个参数就是F1的键值,而前面表示需要组合按下Ctrl,Shift.另外再提醒一次,第二个参数是表示你的程序在系统里注册热键时所使用的一个"编号",与你使用的热键具体是哪个没有任何关系,你所唯一需要保证或者说需要注意的就是不要与其它全局热键冲突,否则会导致之前使用这个"编号"的热键失效,也就是你的这个注册覆盖了它之前的注册.