C# 怎么后台发送组合键ctrl

love_zhao311 2012-12-09 01:19:17
网上说了好多好像都不可以、现在不发送系统按键都没有问题了!就是系统组合键这里不可以。请问怎么实现发送 Ctrl + w 呢
现在的代码如下。应该怎么改才可以?
private static int MakeKeyLparam(byte VirtualKey, bool KeyDown) {
String Firstbyte="";
//lparam参数的24-31位           
if (KeyDown == true){
Firstbyte = "00";           
}else{ 
int First = 12 * 16;
Firstbyte = First.ToString();           
}           
int Scancode=0;//获得键的扫描码           
Scancode = MapVirtualKey(VirtualKey, 0);
String Secondbyte="";//lparam参数的16-23位,即虚拟键扫描码           
String Temp="00"+Scancode.ToString();
Secondbyte=Temp.Substring(Temp.Length-2,2);
String s = Firstbyte+Secondbyte+"0001";   //0001为lparam参数的0-15位,即发送次数和其它扩展信息           
int Back=0;           
int.TryParse(s,out Back);
return Back;       
}       
/// <summary>       
/// 按键       
/// </summary>       
/// <param name=”hWnd”>按键窗口句柄</param>       
/// /// <param name=”key”>按键</param>       
public static void KeyDown(IntPtr hWnd, Keys key)
{            //MyAlert.Alert(MakeKeyLparam((byte)key, true));           
PostMessage(hWnd, WM_KEYDOWN, (IntPtr)key, (IntPtr)MakeKeyLparam((byte)key, true));
System.Threading.Thread.Sleep(100);
PostMessage(hWnd, WM_KEYUP, (IntPtr)key, (IntPtr)MakeKeyLparam((byte)key, false));       
}
...全文
898 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
happySnow_zhe 2012-12-12
  • 打赏
  • 举报
回复
引用 10 楼 love_zhao311 的回复:
引用 8 楼 happySnow_zhe 的回复:引用 7 楼 love_zhao311 的回复:引用 5 楼 happySnow_zhe 的回复:引用 4 楼 love_zhao311 的回复:引用 1 楼 happySnow_zhe 的回复:注册热键就可以了… 你好。 可以说清楚一点吗? 注册热键这东西还真不知道是什么。 我是做java的 调用user32.……
注册热键有个特点,就是只要你注册之后就是全局的,所以说不管你的窗口是否有焦点,该热键就是有效的…
我就是很懒 2012-12-11
  • 打赏
  • 举报
回复
SendKeys.Send()方法试试
蝶恋花雨 2012-12-10
  • 打赏
  • 举报
回复
为了指定那些与 SHIFT、CTRL 及 ALT 等按键结合的组合键,可在这些按键码的前面放置一个或多个代码,这些代码列举如下: 按键 代码 SHIFT + CTRL ^ ALT % SendKeys.SendWait ( "^w" ); //发送 Ctrl + s 键 http://msdn.microsoft.com/zh-cn/library/system.windows.forms.sendkeys.send(VS.80).aspx
  • 打赏
  • 举报
回复
SendMessage(hwnd,WM_KEYDOWN,VK_CONTROL,0); SendMessage(hwnd,WM_KEYDOWN,VK_W,0); SendMessage(hwnd,WM_KEYDOWN,VK_CONTROL,1); SendMessage(hwnd,WM_KEYDOWN,VK_W,1);
happySnow_zhe 2012-12-10
  • 打赏
  • 举报
回复
注册热键就可以了…
love_zhao311 2012-12-10
  • 打赏
  • 举报
回复
引用 8 楼 happySnow_zhe 的回复:
引用 7 楼 love_zhao311 的回复:引用 5 楼 happySnow_zhe 的回复:引用 4 楼 love_zhao311 的回复:引用 1 楼 happySnow_zhe 的回复:注册热键就可以了… 你好。 可以说清楚一点吗? 注册热键这东西还真不知道是什么。 我是做java的 调用user32.dll类库下的API函数: RegisterHo……

//注册热键(窗体句柄,热键ID,辅助键,实键)
            RegisterHotKey(this.Handle, 225, 0, Keys.VolumeUp);
这个函数的意思是不是把 实键 改成 热键??

      protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case 0x0312:    //这个是window消息定义的注册的热键消息 
                    if (m.WParam.ToString().Equals("225"))  //提高音量热键 
                    {
                        MessageBox.Show("你按了VolumeUp ");
                    }
这个就是把 225 键改成了 volumeup 键? 如果我想给后台运行的某个窗口发送 ctrl+a 应该怎么写呢?
love_zhao311 2012-12-10
  • 打赏
  • 举报
回复
引用 8 楼 happySnow_zhe 的回复:
引用 7 楼 love_zhao311 的回复:引用 5 楼 happySnow_zhe 的回复:引用 4 楼 love_zhao311 的回复:引用 1 楼 happySnow_zhe 的回复:注册热键就可以了… 你好。 可以说清楚一点吗? 注册热键这东西还真不知道是什么。 我是做java的 调用user32.dll类库下的API函数: RegisterHo……
嗯。 我知道你说的了。可是我是发送到别外的窗体去。做类似后台操作按键!也可以吗
private void Form1_Load(object sender, EventArgs e)
        {
            //窗体锚定在0,0
            this.Location = new Point(-100, -100);

            this.Height = 20;
            this.Width = 20;
            this.Activate();

            //注册热键(窗体句柄,热键ID,辅助键,实键)
            RegisterHotKey(this.Handle, 225, 0, Keys.VolumeUp);
            RegisterHotKey(this.Handle, 226, 0, Keys.VolumeDown);
            RegisterHotKey(this.Handle, 227, 0, Keys.VolumeMute);
            RegisterHotKey(this.Handle, 227, 0, Keys.Control);

        }
this.Handle 改成我想发送的窗体的句柄可以不
happySnow_zhe 2012-12-10
  • 打赏
  • 举报
回复
引用 7 楼 love_zhao311 的回复:
引用 5 楼 happySnow_zhe 的回复:引用 4 楼 love_zhao311 的回复:引用 1 楼 happySnow_zhe 的回复:注册热键就可以了… 你好。 可以说清楚一点吗? 注册热键这东西还真不知道是什么。 我是做java的 调用user32.dll类库下的API函数: RegisterHotKey(IntPtr 操作窗体句柄,int 热……
那得看你什么时候需要启用热键了,如果是窗体加载完就启用,你就在load事件里调用API注册所需要的组合键即可…,窗体关闭时在卸载热键
love_zhao311 2012-12-10
  • 打赏
  • 举报
回复
引用 5 楼 happySnow_zhe 的回复:
引用 4 楼 love_zhao311 的回复:引用 1 楼 happySnow_zhe 的回复:注册热键就可以了… 你好。 可以说清楚一点吗? 注册热键这东西还真不知道是什么。 我是做java的 调用user32.dll类库下的API函数: RegisterHotKey(IntPtr 操作窗体句柄,int 热键ID(唯一性),KeyModifiers 按住组……
那怎么操作窗体句柄(后台)发送这个热键呢?
happySnow_zhe 2012-12-10
  • 打赏
  • 举报
回复
引用 5 楼 happySnow_zhe 的回复:
引用 4 楼 love_zhao311 的回复:引用 1 楼 happySnow_zhe 的回复:注册热键就可以了… 你好。 可以说清楚一点吗? 注册热键这东西还真不知道是什么。 我是做java的 调用user32.dll类库下的API函数: RegisterHotKey(IntPtr 操作窗体句柄,int 热键ID(唯一性),KeyModifiers 按住组……
然后获取按键信息:
protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case 0x0312:
                    switch (m.WParam.ToString())
                    {
                        case "热键ID":
                            //执行逻辑处理
                            break;
                        default:
                            break;
                    }
                    break;
            }
            base.WndProc(ref m);
        }
happySnow_zhe 2012-12-10
  • 打赏
  • 举报
回复
引用 4 楼 love_zhao311 的回复:
引用 1 楼 happySnow_zhe 的回复:注册热键就可以了… 你好。 可以说清楚一点吗? 注册热键这东西还真不知道是什么。 我是做java的
调用user32.dll类库下的API函数: RegisterHotKey(IntPtr 操作窗体句柄,int 热键ID(唯一性),KeyModifiers 按住组合键(ctrl,alt,shift,windows等),Keys 另一个组合键(A,B,C,D……)):注册热键 UnregisterHotKey(IntPtr 操作窗体句柄,int 卸载热键ID):卸载热键
love_zhao311 2012-12-10
  • 打赏
  • 举报
回复
引用 1 楼 happySnow_zhe 的回复:
注册热键就可以了…
你好。 可以说清楚一点吗? 注册热键这东西还真不知道是什么。 我是做java的
C#如何在后台捕捉按键 [此问题的推荐答案] API别忘了 using System.Runtime.InteropServices; [DllImport("user32.dll")] public static extern UInt32 RegisterHotKey(IntPtr hWnd, UInt32 id, UInt32 fsModifiers, UInt32 vk); //API public Form1() { InitializeComponent(); RegisterHotKey(this.Handle, 247696411, 0, (UInt32)Keys.F10); //注册热键 } //重写消息循环 protected override void WndProc(ref Message m) { const int WM_HOTKEY = 0x0312; // m.WParam.ToInt32() 要和 注册热键时的第2个参数一样 if (m.Msg == WM_HOTKEY && m.WParam.ToInt32() == 247696411) //判断热键 { //写上你的代码 } base.WndProc(ref m); } 写上代码后 只要 在程序运行时按F10就可以触发热键更改按键可以在 注册时改 RegisterHotKey(this.Handle, 247696411, 0, (UInt32)Keys.***); http://baike.baidu.com/view/1080084.html?tp=0_10 这里有RegisterHotKey 的介绍 RegisterHotKey 函数功能:该函数定义一个系统范围的热键。 函数原型:BOOL RegisterHotKey(HWND hWnd,intid,UINT fsModifiers,UINT vk); 参数: hWnd:接收热键产生WM_HOTKEY消息的窗口句柄。若该参数NULL,传递给调用线程的WM_HOTKEY消息必须在消息循环中中进行处理。 id:定义热键的标识符。调用线程中的其他热键不能使用同样的标识符。应用功能程序必须定义一个0X0000-0xBFFF范围的值。一个共享的动态链接库(DLL)必须定义一个0xC000-0xFFFF范围的值伯GlobalAddAtom函数返回该范围)。为了避免与其他动态链接库定义的热键冲突,一个DLL必须使用GlobalAddAtom函数获得热键的标识符。 fsModifoers:定义为了产生WM_HOTKEY消息而必须与由nVirtKey参数定义的键一起按下的键。该参数可以是如下值的组合: MOD_ALT:按下的可以是任一Alt键。MOD_CONTROL:按下的可以是任一Ctrl键。 MOD_SHIFT:按下的可以是任一Shift键。 MOD_WIN:按下的可以是任一Windows按键。这些键可以用Microsoft Windows日志记录下来。 vk:定义热键的虚拟键码。 返回值:若函数调用成功,返回一个非O值。若函数调用失败,则返回值为0。若要获得更多的错误信息,可以调用GetLastError函数。 本贴来自ZDNetChina中文社区 http://bbs.zdnet.com.cn ,本贴地址:http://bbs.zdnet.com.cn/viewthread.php?tid=93775 RegisterHotKey   函数功能:该函数定义一个系统范围的热键。   函数原型:BOOL RegisterHotKey(HWND hWnd,intid,UINT fsModifiers,UINT vk);   参数:   hWnd:接收热键产生WM_HOTKEY消息的窗口句柄。若该参数NULL,传递给调用线程的WM_HOTKEY消息必须在消息循环中中进行处理。   id:定义热键的标识符。调用线程中的其他热键不能使用同样的标识符。应用功能程序必须定义一个0X0000-0xBFFF范围的值。一个共享的动态链接库(DLL)必须定义一个0xC000-0xFFFF范围的值伯GlobalAddAtom函数返回该范围)。为了避免与其他动态链接库定义的热键冲突,一个DLL必须使用GlobalAddAtom函数获得热键的标识符。   fsModifoers:定义为了产生WM_HOTKEY消息而必须与由nVirtKey参数定义的键一起按下的键。该参数可以是如下值的组合:   MOD_ALT:按下的可以是任一Alt键。MOD_CONTROL:按下的可以是任一Ctrl键。   MOD_SHIFT:按下的可以是任一Shift键。   MOD_WIN:按下的可以是任一Windows按键。这些键可以用Microsoft Windows日志记录下来。   vk:定义热键的虚拟键码。   返回值:若函数调用成功,返回一个非O值。若函数调用失败,则返回值为0。若要获得更多的错误信息,可以调用GetLastError函数。   备注:当某键被接下时,系统在所有的热键中寻找匹配者。一旦找到一个匹配的热键,系统将把WM_HOTKEY消息传递给登记了该热键的线程的消息队列。该消息被传送到队列头部,因此它将在下一轮消息循环中被移去。该函数不能将热键同其他线程创建的窗口关联起来。   若为一热键定义的击键己被其他热键所定义,则RegisterHotKey函数调用失败。   若hWnd参数标识的窗口已用与id参数定义的相同的标识符登记了一个热键,则参数fsModifiers和vk的新值将替代这些参数先前定义的值。   Windows CE:Windows CE 2.0以上版本对于参数fsModifiers支持一个附加的标志位。叫做MOD_KEYUP。   若设置MOD_KEYUP位,则当发生键被按下或被弹起的事件时,窗口将发送WM_HOTKEY消息。   RegisterHotKey可以被用来在线程之间登记热键。   速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;头文件:winuser.h;库文件:user32.lib

111,094

社区成员

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

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

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