天天看点

WINFROM自定义热键我的程序人生

<code>先定义一个热键类</code>

<code>using</code> <code>System;</code>

<code>using</code> <code>System.Collections.Generic;</code>

<code>using</code> <code>System.Text;</code>

<code>using</code> <code>System.Runtime.InteropServices;</code>

<code>using</code> <code>System.Windows.Forms;</code>

<code>namespace</code> <code>ExcelReportDesigner</code>

<code>{</code>

<code>    </code><code>class</code> <code>WinHotKey</code>

<code>    </code><code>{</code>

<code>        </code><code>public</code> <code>WinHotKey()</code>

<code>        </code><code>{</code>

<code>        </code><code>}</code>

<code>        </code><code>//如果函数执行成功,返回值不为0。       </code>

<code>        </code><code>//如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。</code>

<code>        </code><code>[DllImport(</code><code>"user32.dll"</code><code>, SetLastError =</code><code>true</code><code>)]</code>

<code>        </code><code>public</code> <code>static</code> <code>extern</code> <code>bool</code> <code>RegisterHotKey(</code>

<code>              </code><code>IntPtr hWnd, </code><code>//要定义热键的窗口的句柄</code>

<code>              </code><code>int</code> <code>id,</code><code>//定义热键ID(不能与其它ID重复)</code>

<code>              </code><code>KeyModifiers fsModifiers,</code><code>//标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效</code>

<code>              </code><code>Keys vk</code><code>//定义热键的内容</code>

<code>              </code><code>);</code>

<code>        </code><code>public</code> <code>static</code> <code>extern</code> <code>bool</code> <code>UnregisterHotKey(</code>

<code>              </code><code>IntPtr hWnd,</code><code>//要取消热键的窗口的句柄</code>

<code>              </code><code>int</code> <code>id  </code><code>//要取消热键的ID</code>

<code>        </code><code>//定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)</code>

<code>        </code><code>[Flags()]</code>

<code>        </code><code>public</code> <code>enum</code> <code>KeyModifiers</code>

<code>            </code><code>None = 0,</code>

<code>            </code><code>Alt = 1,</code>

<code>            </code><code>Control = 2,</code>

<code>            </code><code>Shift = 4,</code>

<code>            </code><code>Windows = 8</code>

<code>    </code><code>}</code>

<code>}</code>

<code>/*</code>

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

<code> </code><code>* 并且user32.dll是非托管代码,不能用命名空间的方式直接引用,所以需要用“DllImport”进行引入后才能使用。</code>

<code> </code><code>* 于是在函数前面需要加上“[DllImport("user32.dll", SetLastError = true)]”这行语句。</code>

<code> </code><code>* “public static extern bool UnregisterHotKey()”这个函数用于注销热键,同理也需要用DllImport引用user32.dll后才能使用。</code>

<code> </code><code>* “public enum KeyModifiers{}”定义了一组枚举,将辅助键的数字代码直接表示为文字,以方便使用。</code>

<code> </code><code>* 这样在调用时我们不必记住每一个辅助键的代码而只需直接选择其名称即可。</code>

<code> </code><code>*/</code>

<code> </code> 

<code>2使用方法:</code>

<code> </code><code>private</code> <code>void</code> <code>frmMain_Load(</code><code>object</code> <code>sender, EventArgs e)</code>

<code>   </code><code>//注册热键Ctrl+S,Id号为100。HotKey.KeyModifiers.Ctrl也可以直接使用数字2来表示。</code>

<code>            </code><code>WinHotKey.RegisterHotKey(Handle, 100, WinHotKey.KeyModifiers.Control, Keys.S);</code>

<code>  </code><code>private</code> <code>void</code> <code>frmSpreadsheet_FormClosing(</code><code>object</code> <code>sender, FormClosingEventArgs e)</code>

<code>            </code><code>WinHotKey.UnregisterHotKey(Handle, 100);</code>

<code>需要在使用的From重写WndProc方法</code>

<code>  </code><code>protected</code> <code>override</code> <code>void</code> <code>WndProc(</code><code>ref</code> <code>Message msg)</code>

<code>            </code><code>const</code> <code>int</code> <code>WM_HOTKEY = 0x0312;   </code><code>//按快捷键    </code>

<code>            </code><code>if</code> <code>(msg.Msg == WM_HOTKEY)</code>

<code>            </code><code>{</code>

<code>                </code><code>switch</code> <code>(msg.WParam.ToInt32())</code>

<code>                </code><code>{</code>

<code>                    </code><code>case</code> <code>100:   </code><code>//按下的是Shift+S                    </code>

<code>                        </code><code>try</code>

<code>                        </code><code>{</code>

<code>                            </code><code>axSpreadsheet.Export(filePath, SheetExportActionEnum.ssExportActionNone,</code>

<code>                                  </code><code>SheetExportFormat.ssExportAsAppropriate);</code>

<code>                        </code><code>}</code>

<code>                        </code><code>catch</code> <code>(Exception ex)</code>

<code>                            </code><code>MessageBox.Show(</code><code>"保存失败!"</code><code>,</code><code>"错误提示!"</code><code>, MessageBoxButtons.OK, MessageBoxIcon.Error);</code>

<code>                        </code><code>break</code><code>;</code>

<code>                    </code><code>case</code> <code>101:   </code><code>//按下的是Ctrl+B                                </code>

<code>                    </code><code>case</code> <code>102:   </code><code>//按下的是Alt+D                                    </code>

<code>                </code><code>}</code>

<code>            </code><code>}</code>

<code>            </code><code>base</code><code>.WndProc(</code><code>ref</code> <code>msg);</code>

版权说明

  如果标题未标有&lt;转载、转&gt;等字则属于作者原创,欢迎转载,其版权归作者和博客园共有。 

  作      者:温景良

WINFROM自定义热键我的程序人生
WINFROM自定义热键我的程序人生

<a href="http://home.cnblogs.com/u/wenjl520/">温景良(Jason)</a>

<a href="http://home.cnblogs.com/u/wenjl520/followees">关注 - 32</a>

<a href="http://home.cnblogs.com/u/wenjl520/followers">粉丝 - 161</a>

<a>+加关注</a>

<a></a>

Post Comment

好东西,讲的很清楚

学习下了!

<b>最新IT新闻</b>:

<b>最新知识库文章</b>:

本文转自

博客园博客,原文链接:http://www.cnblogs.com/wenjl520/archive/2008/12/25/1362437.html,如需转载请自行联系原作者

继续阅读