<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>
版權說明
如果标題未标有<轉載、轉>等字則屬于作者原創,歡迎轉載,其版權歸作者和部落格園共有。
作 者:溫景良

<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,如需轉載請自行聯系原作者