【WinForm程序】注册热键快捷键切换

摘要:
重写DefWndProc事件#regionWindow消息捕获constintWM_COPYDATA=0x004A;publicstructCOPYDATASTRUCT{publicIntPtrdwData;publicintcbData;[MarshalAs(UnmanagedType.LPStr)]publicstringlpData;}[DllImport("user32")]publics

重写DefWndProc事件

#region Window 消息捕获
        const int WM_COPYDATA = 0x004A;
        public structCOPYDATASTRUCT
        {
            publicIntPtr dwData;
            public intcbData;
            [MarshalAs(UnmanagedType.LPStr)]
            public stringlpData;
        }
        [DllImport("user32")]
        public static extern bool ChangeWindowMessageFilter(uint msg, intflags);  
        protected override void DefWndProc(refSystem.Windows.Forms.Message m)
        {
            switch(m.Msg)
            {
                caseWM_COPYDATA:
                    COPYDATASTRUCT mystr = newCOPYDATASTRUCT();
                    Type mytype =mystr.GetType();
                    mystr =(COPYDATASTRUCT)m.GetLParam(mytype);
                    Trace(mystr.lpData);
                    processCommand(mystr.lpData);
                    break;
                default:
                    base.DefWndProc(refm);
                    break;
            }
            //System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString() + "  " + m.Msg.ToString());
}
        #endregion Window 消息捕获

重写WndProc事件

        //注册热键的api
        [DllImport("user32")]
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, uintcontrol, Keys vk);
        //解除注册热键的api
        [DllImport("user32")]
        public static extern bool UnregisterHotKey(IntPtr hWnd, intid);
        private frmHotkeyTest testFrm = null;
        private void ShowTestFrm(string_text)
        {
            testFrm = newfrmHotkeyTest();
            this.WindowState =FormWindowState.Maximized;
            this.TopMost = true;
            this.Show();
            this.TopMost = false;
            testFrm.Text =_text;
            testFrm.ShowDialog();
        }
        protected override void WndProc(refMessage m)
        {
            switch(m.Msg)
            {
                case 0x0312:  //这个是window消息定义的注册的热键消息  
                    if (m.WParam.ToString() == "123")   //按下CTRL+Q隐藏  
{
                        testFrm = newfrmHotkeyTest();
                        testFrm.ShowDialog();
                    }
                    else if (m.WParam.ToString() == "456") //按下CTRL+W显示
{
                        testFrm.Close();
                    }
                    else if (m.WParam.ToString() == "103")
                    {
                        ShowTestFrm("F5");
                    }
                    else if (m.WParam.ToString() == "102")
                    {
                        ShowTestFrm("Ctrl+Alt+D");
                    }
                    else if (m.WParam.ToString() == "101")
                    {
                        ShowTestFrm("Ctrl+B");
                    }
                    else if (m.WParam.ToString() == "100")
                    {
                        ShowTestFrm("Shift+S");
                    }
                    break;
            }
            base.WndProc(refm);
        }

在回调WndProc方法中,根据消息编码判断各种快捷键回调处理即可

例如:

if (m.WParam.ToString() == "123")   //按下CTRL+Q隐藏  

免责声明:文章转载自《【WinForm程序】注册热键快捷键切换》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# Post form-data 上传SVN常见问题汇总下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

4G EPS 中建立 eNB 与 MME 之间的 S1 连接

目录 文章目录 目录 前文列表 S1 连接 eNB 的 S1 连接 UE 的 S1 连接 前文列表 《4G EPS 中的小区搜索》《4G EPS 中的 PLMN 选择》《4G EPS 中的小区选择》《4G EPS 中的随机接入》《4G EPS 中建立 UE 与 eNB 之间的 RRC 连接》 S1 连接 NOTE:这里的 S1 连接我们特指 S...

C#中对Winform中的DataGridView的控制技巧。(单独控制某单元格的按钮不显示、某单元格的ReadOnly)

1:控制按钮列中的某一行不显示按钮。(使用环境:数据的移动,如把第二行的数据移动到上面去,最下面的一行为合计行,不允许移动,因此,就需要把第一行与最后一行的按钮屏蔽掉。屏蔽的方法:把按钮改成普通的单元格。具体实现代码如下:(第8列中的第一行与最后一行按钮不显示)) //定义绘画表格前的事件,在绘画前把按钮转换成普通单元格。dataGrid.RowPreP...

Systemd日志管理服务:Journald以及重要配置选项

Journald是systemd引入的用于收集和存储日志数据的系统服务。它试图使系统管理员可以在越来越多的日志消息中更轻松地找到有趣且相关的信息。为了实现此目标,日记中的主要更改之一是用为日志消息优化的特殊文件格式替换简单的纯文本日志文件。这种文件格式使系统管理员可以更有效地访问相关消息。它还为单个系统带来了数据库驱动的集中日志记录实现的某些功能。 概览s...

Window API 之 PostMessage (消息投递)

PostMessage: 将一条消息投递到指定窗口的消息队列。投递的消息会在Windows事件处理过程中得到处理。 在那个时候,会随同投递的消息调用指定窗口的窗口函数。特别适合那些不需要立即处理的 窗口消息的发送返回值 。自己的理解是:通过这个函数,可以将自己想发送的消息发送到你想发送的窗口。就好比是两个人在发短信,那么这个函数就相当于是一部手机。查找资料...

用QT在Windows下编写dll程序

转自:http://blog.csdn.net/yyzsyx/article/details/6086052 因为QT必须有调用QApplication的exec方法,这样才能产生消息循环,QT的程序才可以运行。所以说如果我们使用了QT编写了dll程序,在普通的 windows程序中是不能调用的。在调用的时候会出现错误。当然QT提供了解决方法:那就是QTW...

Netty(4)Stream by codec(粘包与拆包)

TCP/IP,传输的是byte[],将byte[]放入队列中。可能会发生粘包和拆包。 比如,客户端向服务端发送了2条消息,分别为D1,D2,可能产生的情况,如下图所示: 情况一:正常的。 情况二:粘包。 情况三:拆包。即:部分数据不是一次完整发送的,而是分了至少2次发送。 如本例,D2拆成了D2_1和D2_2,这是拆包。 服务端分2次收到包,第一次收到了...