想同时按下Shift + Alt + P 呼出程序a.exe,如何弄

ymk 2010-06-03 09:30:30
想同时按下Shift + Alt + P 呼出程序a.exe,如何弄
...全文
189 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
拿凤姐抵债 2010-06-06
  • 打赏
  • 举报
回复
哪本书有API的权威解释。
heword999 2010-06-06
  • 打赏
  • 举报
回复
感觉应该用到热键API,
在窗体接收键盘消息...
spmzfz 2010-06-06
  • 打赏
  • 举报
回复
FROM CSDN:


private RegisterHotKeyClass _RegisKey = new RegisterHotKeyClass();
private void button6_Click(object sender, EventArgs e)
{
_RegisKey.Keys = Keys.Q;
_RegisKey.ModKey = RegisterHotKeyClass.MODKEY.MOD_CONTROL | RegisterHotKeyClass.MODKEY.MOD_ALT;
_RegisKey.WindowHandle = this.Handle;
_RegisKey.HotKey += new RegisterHotKeyClass.HotKeyPass(_Regis_HotKey);
_RegisKey.StarHotKey();

}

void _Regis_HotKey()
{
MessageBox.Show("Ctrl + Alt + Q");
}


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);

}


ymk 2010-06-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuyazhe 的回复:]
C# code

转自:http://www.kkee.cn/article.asp?id=84

要设置快捷键必须使用user32.dll下面的两个方法。
BOOL RegisterHotKey( //注册系统热键的API函数
 HWND hWnd,
 int id,
 UINT fsModifiers,
 UINT vk
);

BOOL Unregist……
[/Quote]

如何使用,能给个例子吗
HolyPlace 2010-06-03
  • 打赏
  • 举报
回复
貌似只能使用RegisterHotKey ,如果使用程序获取组合键,当程序当前不是激活状态的那么获取不了
兔子-顾问 2010-06-03
  • 打赏
  • 举报
回复
不用RegisterHotKey的话,如果你窗体没有激活。你就没有办法捕获消息了。这个需求一定要用api.
huwei001982 2010-06-03
  • 打赏
  • 举报
回复
只能用 RegisterHotKey 函数
foxd 2010-06-03
  • 打赏
  • 举报
回复
//窗体的KeyPreview属性必须设置为true

// Ctrl + H
//if ((Control.ModifierKeys & Keys.Control) != 0 && e.KeyCode == Keys.H)
//{
// MessageBox.Show("Ctrl + H");
//}

// Alt + H
//if ((Control.ModifierKeys & Keys.Alt) != 0 && e.KeyCode == Keys.H)
//{
// MessageBox.Show("Alt + H");
//}

// Shift + H
//if ((Control.ModifierKeys & Keys.Shift) != 0 && e.KeyCode == Keys.H)
//{
// MessageBox.Show("Shift + H");
//}

// Ctrl + Alt + Shift + F8
if ((Control.ModifierKeys & Keys.Control) != 0 && (Control.ModifierKeys & Keys.Alt) != 0 && (Control.ModifierKeys & Keys.Shift) != 0 && e.KeyCode == Keys.F8)
{
frmLogin.M_Cheat = "On";
frmLogin.M_FuncKey = "";

}
铛铛 2010-06-03
  • 打赏
  • 举报
回复
mark 一下
ymk 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 superliu1122 的回复:]
用RegisterHotKey函数
[/Quote]

.NET类库中没有这个函数。应该是api吧,为不想用api,想用.net类库实现
兔子-顾问 2010-06-03
  • 打赏
  • 举报
回复

转自:http://www.kkee.cn/article.asp?id=84

要设置快捷键必须使用user32.dll下面的两个方法。
BOOL RegisterHotKey( //注册系统热键的API函数
 HWND hWnd,
 int id,
 UINT fsModifiers,
 UINT vk
);

BOOL UnregisterHotKey( //删除系统热键的API函数
 HWND hWnd,
 int id
);

在C#中引用命名空间System.Runtime.InteropServices;来加载非托管类user32.dll
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace HotKey
{

public enum KeyModifiers //组合键枚举
{
None = 0,
Alt = 1,
Control = 2,
Shift = 4,
Windows = 8
}

public partial class Form1 : Form
{
/*
* RegisterHotKey函数原型及说明:
* BOOL RegisterHotKey(
* HWND hWnd, // window to receive hot-key notification
* int id, // identifier of hot key
* UINT fsModifiers, // key-modifier flags
* UINT vk // virtual-key code);
* 参数 id为你自己定义的一个ID值
* 对一个线程来讲其值必需在0x0000 - 0xBFFF范围之内,十进制为0~49151
* 对DLL来讲其值必需在0xC000 - 0xFFFF 范围之内,十进制为49152~65535
* 在同一进程内该值必须唯一参数 fsModifiers指明与热键联合使用按键
* 可取值为:MOD_ALT MOD_CONTROL MOD_WIN MOD_SHIFT参数,或数字0为无,1为Alt,2为Control,4为Shift,8为Windows
* vk指明热键的虚拟键码
*/

[System.Runtime.InteropServices.DllImport("user32.dll")] //申明API函数
public static extern bool RegisterHotKey(
IntPtr hWnd, // handle to window
int id, // hot key identifier
uint fsModifiers, // key-modifier options
Keys vk // virtual-key code
);
[System.Runtime.InteropServices.DllImport("user32.dll")] //申明API函数
public static extern bool UnregisterHotKey(
IntPtr hWnd, // handle to window
int id // hot key identifier
);
public Form1()
{
InitializeComponent();
}
private void ProcessHotkey(Message m) //按下设定的键时调用该函数
{
IntPtr id = m.WParam; //IntPtr用于表示指针或句柄的平台特定类型
//MessageBox.Show(id.ToString());
string sid = id.ToString();
switch (sid)
{
case "100":
MessageBox.Show("调用A函数");
break;
case "200":
MessageBox.Show("调用B函数");
break;
}
}
private void Form1_Load(object sender, EventArgs e)
{
//Handle为当前窗口的句柄,继续自Control.Handle,Control为定义控件的基类
//RegisterHotKey(Handle, 100, 0, Keys.A); //注册快捷键,热键为A
//RegisterHotKey(Handle, 100, KeyModifiers.Alt | KeyModifiers.Control, Keys.B);//这时热键为Alt+CTRL+B
//RegisterHotKey(Handle, 100, 1, Keys.B); //1为Alt键,热键为Alt+B
RegisterHotKey(Handle, 100, 2,Keys.A); //定义热键为Alt+Tab,这里实现了屏幕系统Alt+Tab键
RegisterHotKey(Handle, 200, 2, Keys.B); //注册2个热键,根据id值100,200来判断需要执行哪个函数
}

private void button1_Click(object sender, EventArgs e) //重新设置热键
{
UnregisterHotKey(Handle, 100);//卸载快捷键
RegisterHotKey(Handle, 100, 2, Keys.C); //注册新的快捷键,参数0表示无组合键
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e) //退出程序时缷载热键
{
UnregisterHotKey(Handle, 100);//卸载第1个快捷键
UnregisterHotKey(Handle, 200); //缷载第2个快捷键
}

//重写WndProc()方法,通过监视系统消息,来调用过程
protected override void WndProc(ref Message m)//监视Windows消息
{
const int WM_HOTKEY = 0x0312;//如果m.Msg的值为0x0312那么表示用户按下了热键
switch (m.Msg)
{
case WM_HOTKEY:
ProcessHotkey(m);//按下热键时调用ProcessHotkey()函数
break;
}
base.WndProc(ref m); //将系统消息传递自父类的WndProc
}
}
}

messi_yang 2010-06-03
  • 打赏
  • 举报
回复
這個 不會····
superliu1122 2010-06-03
  • 打赏
  • 举报
回复
用RegisterHotKey函数
z812183667 2010-06-03
  • 打赏
  • 举报
回复
不会,帮顶,等待高手!
S314324153 2010-06-03
  • 打赏
  • 举报
回复
你这个快捷键不是菜单,只能用API
ymk 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 huwei001982 的回复:]
只能用 RegisterHotKey 函数
[/Quote]

111,125

社区成员

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

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

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