请问,C#WinForm程序快捷键怎样设置啊?

jasperu 2011-01-31 11:11:53
我的一个截图程序,我设置了快捷键,用来实现相应的截图功能(截图和保存的实现)。。
代码
private void buttonfullscr_KeyUp(object sender, KeyEventArgs e)
{


//---- 这里是增加的快捷键 。键盘的,要利用KeyCode实现的。。。。。


if (e.Control & e.KeyCode==Keys.Q)
{
buttonfullscr_Click(sender2, e2); // 截图事件
}
}

private void Form1_KeyUp(object sender, KeyEventArgs e)
{

// 表示保存我们的图像的快捷键
if (e.Control & e.KeyCode == Keys.S)
{
button1_Click(ojb1, e2);//保存事件
}
}

开始,我还以为可以的。但是,后来,我遇到一个事情就是,如果我把我的程序最小化,或者是一些其他的程序获得了焦点之后,我的程序的快捷键不起作用!我认为,因为我程序的KEYUP 事件是相对于我的这个WINFORM 的窗口的,所以,在那中情况下不能实现截图,
但是,各位应该怎样实现
当我的程序最小化,但是还能使用其快捷键进行相应操作的的》?
请各位不吝赐教.
...全文
286 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gw6328 2011-01-31
  • 打赏
  • 举报
回复
可以在菜单文字前加& 如 取消(&A) 这个按钮的快捷键就是Alt+A,但是ctrl shift的我不清楚。
wuyq11 2011-01-31
  • 打赏
  • 举报
回复
IMessageFilter接口,注册全局消息
[DllImport("user32")]
public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint control, Keys vk);
[DllImport("user32")]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

C#实现快捷键(系统热键)响应(转)


在应用中,我们可能会需要实现像Ctrl+C复制、Ctrl+V粘贴这样的快捷键,本文简单介绍了它的实现,并给出了一个实现类。
(1)建立一个类文件,命名为HotKey.cs,代码如下:
C# codeusing System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace KoalaStudio.BookshopManager
{
class HotKey
{
//如果函数执行成功,返回值不为0。
//如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。
[DllImport("user32.dll", SetLastError = true)]
public static extern bool RegisterHotKey(
IntPtr hWnd, //要定义热键的窗口的句柄
int id, //定义热键ID(不能与其它ID重复)
KeyModifiers fsModifiers, //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
Keys vk //定义热键的内容
);

[DllImport("user32.dll", SetLastError = true)]
public static extern bool UnregisterHotKey(
IntPtr hWnd, //要取消热键的窗口的句柄
int id //要取消热键的ID
);

//定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)
[Flags()]
public enum KeyModifiers
{
None = 0,
Alt = 1,
Ctrl = 2,
Shift = 4,
WindowsKey = 8
}
}
}

简单说明一下:
“public static extern bool RegisterHotKey()”这个函数用于注册热键。由于这个函数需要引用user32.dll动态链接库后才能使用,并且

user32.dll是非托管代码,不能用命名空间的方式直接引用,所以需要用“DllImport”进行引入后才能使用。于是在函数前面需要加上

“[DllImport("user32.dll", SetLastError = true)]”这行语句。
“public static extern bool UnregisterHotKey()”这个函数用于注销热键,同理也需要用DllImport引用user32.dll后才能使用。
“public enum KeyModifiers{}”定义了一组枚举,将辅助键的数字代码直接表示为文字,以方便使用。这样在调用时我们不必记住每一个辅

助键的代码而只需直接选择其名称即可。

(2)以窗体FormA为例,介绍HotKey类的使用

在FormA的Activate事件中注册热键,本例中注册Shift+S,Ctrl+Z,Alt+D这三个热键。这里的Id号可任意设置,但要保证不被重复。
C# codeprivate void Form_Activated(object sender, EventArgs e)
{
//注册热键Shift+S,Id号为100。HotKey.KeyModifiers.Shift也可以直接使用数字4来表示。
HotKey.RegisterHotKey(Handle, 100, HotKey.KeyModifiers.Shift, Keys.S);
//注册热键Ctrl+B,Id号为101。HotKey.KeyModifiers.Ctrl也可以直接使用数字2来表示。
HotKey.RegisterHotKey(Handle, 101, HotKey.KeyModifiers.Ctrl, Keys.B);
//注册热键Alt+D,Id号为102。HotKey.KeyModifiers.Alt也可以直接使用数字1来表示。
HotKey.RegisterHotKey(Handle, 102, HotKey.KeyModifiers.Alt, Keys.D);
}

在FormA的Leave事件中注销热键。
private void FrmSale_Leave(object sender, EventArgs e)
{
//注销Id号为100的热键设定
HotKey.UnregisterHotKey(Handle, 100);
//注销Id号为101的热键设定
HotKey.UnregisterHotKey(Handle, 101);// http://ike.126.com
//注销Id号为102的热键设定
HotKey.UnregisterHotKey(Handle, 102);
}



重载FromA中的WndProc函数
C# code///
/// 监视Windows消息
/// 重载WndProc方法,用于实现热键响应
///
///
protected override void WndProc(ref Message m)
{
const int WM_HOTKEY = 0x0312;//如果m.Msg的值为0x0312那么表示用户按下了热键
//按快捷键
switch (m.Msg)
{
case WM_HOTKEY:
switch (m.WParam.ToInt32())
{
case 100: //按下的是Shift+S
//此处填写快捷键响应代码
break;
case 101: //按下的是Ctrl+B
//此处填写快捷键响应代码
break;
case 102: //按下的是Alt+D
//此处填写快捷键响应代码
break;
}
break;
}
base.WndProc(ref m);
}
足球中国 2011-01-31
  • 打赏
  • 举报
回复
这个叫热键。楼上的方法可以行的通。
zpf82118 2011-01-31
  • 打赏
  • 举报
回复
///// <summary>
///// register hot key
///// </summary>
///// <param name="hWnd">the handle of window, on which the hot key will be registered</param>
///// <param name="id">id of hot key</param>
///// <param name="fsModifiers">special keys like: Ctrl,Alt,Shift,Window</param>
///// <param name="vk">nomal keys like:A B C F1,F2 etc.</param>
///// <returns></returns>
//[DllImportAttribute("user32.dll", EntryPoint = "RegisterHotKey")]
//public static extern bool RegisterHotKey
//(
// IntPtr hWnd, //要注册热键的窗口句柄
// int id, //热键编号
// int fsModifiers, //特殊键如:Ctrl,Alt,Shift,Window
// int vk //一般键如:A B C F1,F2 等
//);

///// <summary>
///// unregister hot key
///// </summary>
///// <param name="hWnd">the handle of window, on which the hot key registered</param>
///// <param name="id">id of hot key</param>
///// <returns></returns>
//[DllImportAttribute("user32.dll", EntryPoint = "UnregisterHotKey")]
//public static extern bool UnregisterHotKey
//(
// IntPtr hWnd, //注册热键的窗口句柄
// int id //热键编号上面注册热键的编号
//);

//private enum MyCtrlKeys
//{
// None = 0,
// Alt = 1,
// Ctrl = 2,
// Shift = 4,
// Win = 8
//}

//public enum MyFunctionHotKeys
//{
// Ctrl_New = 100, // new bill
// Ctrl_Shift_New = 101, // new resource list
// Ctrl_Open = 102, // open bill
// Ctrl_Save = 103, // save bill

// Ctrl_MoveUp = 200, // move up
// Ctrl_MoveDown = 201, // move down
// Ctrl_Cut = 202, // cut
// Ctrl_Copy = 203, // copy
// Ctrl_Paste = 204, // paste
// Ctrl_Undo = 205, // undo
// Ctrl_Redo = 206, // redo
// Ctrl_Replace = 207, // replace
// Delete = 208, // delete

// Alt_F5 = 300, // refresh device list

// Alt_F7 = 400 // option / config
//}

//const int WM_HOTKEY = 0x312;

//// 注册热键
//void RegisterHotKeys()
//{
// RegisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_New, (int)MyCtrlKeys.Ctrl, (int)Keys.N);
// RegisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_Shift_New, (int)MyCtrlKeys.Ctrl | (int)MyCtrlKeys.Shift, (int)Keys.N);
// RegisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_Open, (int)MyCtrlKeys.Ctrl, (int)Keys.O);
// RegisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_Save, (int)MyCtrlKeys.Ctrl, (int)Keys.S);

// RegisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_MoveUp, (int)MyCtrlKeys.Ctrl, (int)Keys.Up);
// RegisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_MoveDown, (int)MyCtrlKeys.Ctrl, (int)Keys.Down);
// RegisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_Cut, (int)MyCtrlKeys.Ctrl, (int)Keys.X);
// RegisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_Copy, (int)MyCtrlKeys.Ctrl, (int)Keys.C);
// RegisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_Paste, (int)MyCtrlKeys.Ctrl, (int)Keys.V);
// RegisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_Undo, (int)MyCtrlKeys.Ctrl, (int)Keys.Z);
// RegisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_Redo, (int)MyCtrlKeys.Ctrl, (int)Keys.Y);
// RegisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_Replace, (int)MyCtrlKeys.Ctrl, (int)Keys.F);
// RegisterHotKey(this.Handle, (int)MyFunctionHotKeys.Delete, (int)MyCtrlKeys.None, (int)Keys.Delete);

// RegisterHotKey(this.Handle, (int)MyFunctionHotKeys.Alt_F5, (int)MyCtrlKeys.Alt, (int)Keys.F5);

// RegisterHotKey(this.Handle, (int)MyFunctionHotKeys.Alt_F7, (int)MyCtrlKeys.Alt, (int)Keys.F7);
//}

//// 注销热键
//void UnRegisterHotKeys()
//{
// UnregisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_New);
// UnregisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_Shift_New);
// UnregisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_Open);
// UnregisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_Save);

// UnregisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_MoveUp);
// UnregisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_MoveDown);
// UnregisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_Cut);
// UnregisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_Copy);
// UnregisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_Paste);
// UnregisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_Undo);
// UnregisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_Redo);
// UnregisterHotKey(this.Handle, (int)MyFunctionHotKeys.Ctrl_Replace);
// UnregisterHotKey(this.Handle, (int)MyFunctionHotKeys.Delete);

// UnregisterHotKey(this.Handle, (int)MyFunctionHotKeys.Alt_F5);

// UnregisterHotKey(this.Handle, (int)MyFunctionHotKeys.Alt_F7);
//}

//protected override void WndProc(ref Message msg)
//{
// if (msg.Msg == WM_HOTKEY)
// {
// switch ((MyFunctionHotKeys)(msg.WParam.ToInt32()))
// {
// case MyFunctionHotKeys.Ctrl_New:
// uiMainFormOperation.menuItemNewBill_Click(null, null);
// break;
// case MyFunctionHotKeys.Ctrl_Shift_New:
// uiMainFormOperation.menuItemNewClipList_Click(null, null);
// break;
// case MyFunctionHotKeys.Ctrl_Open:
// uiMainFormOperation.menuItemOpenBill_Click(null, null);
// break;
// case MyFunctionHotKeys.Ctrl_Save:
// uiMainFormOperation.menuItemSaveBill_Click(null, null);
// break;

// case MyFunctionHotKeys.Ctrl_MoveUp:
// uiMainFormOperation.menuItemMoveUp_Click(null, null);
// break;
// case MyFunctionHotKeys.Ctrl_MoveDown:
// uiMainFormOperation.menuItemMoveDown_Click(null, null);
// break;
// case MyFunctionHotKeys.Ctrl_Cut:
// uiMainFormOperation.menuItemCut_Click(null, null);
// break;
// case MyFunctionHotKeys.Ctrl_Copy:
// uiMainFormOperation.menuItemCopy_Click(null, null);
// break;
// case MyFunctionHotKeys.Ctrl_Paste:
// uiMainFormOperation.menuItemPaste_Click(null, null);
// break;
// case MyFunctionHotKeys.Ctrl_Undo:
// uiMainFormOperation.menuItemUndo_Click(null, null);
// break;
// case MyFunctionHotKeys.Ctrl_Redo:
// uiMainFormOperation.menuItemRedo_Click(null, null);
// break;
// case MyFunctionHotKeys.Ctrl_Replace:
// uiMainFormOperation.menuItemReplace_Click(null, null);
// break;
// case MyFunctionHotKeys.Delete:
// uiMainFormOperation.menuItemDelete_Click(null, null);
// break;

// case MyFunctionHotKeys.Alt_F5:
// uiMainFormOperation.menuItemRefreshDevice_Click(null, null);
// break;
// case MyFunctionHotKeys.Alt_F7:
// uiMainFormOperation.menuItemOption_Click(null, null);
// break;
// default:
// break;
// }
// }
// base.WndProc(ref msg);
//}
zpf82118 2011-01-31
  • 打赏
  • 举报
回复
设置普通的hotkey只能是在你的窗口获得焦点的时候起作用
如果想在任何时候都起作用的话就要手动注册热键了:1)在程序启动的时候注册你感兴趣的热键;2)重写WndProc(ref Message msg)函数处理热键消息;3)程序退出的时候注销热键。
但这种方法过于霸道了,呵呵。
下面是一个例子(我最后并没有用这种方法)
wy811007 2011-01-31
  • 打赏
  • 举报
回复
额 用win32 api的 钩子 注册热键 上面已经给例子了 我就不重复了.

110,534

社区成员

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

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

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