<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                最近由于項目中需要精確記錄某些操作的發生時間,但又沒有辦法打日志,因此寫了個小工具,用來記錄當前的毫秒級本機時間。 (程序內部實現了全局鉤子,監聽所有的鍵盤事件,即KeyDown,KeyUp事件。) 工具功能如下: ![](image/d41d8cd98f00b204e9800998ecf8427e.png) 1.通過任意鍵盤按鍵來記錄當前時間 2.可以在列表處單擊記錄當前時間 C#中對于Hook API的包裝如下: using?System; using?System.Collections.Generic; using?System.Linq; using?System.Reflection; using?System.Runtime.InteropServices; using?System.Text; namespace?HookLib { ???public?static?class?HookHelper ?? { ???????public?delegate?int?HookProc( ???????????int?nCode, ???????????IntPtr?wParam, ???????????IntPtr?lParam ?????????? ); ???????public?static?int?HookCallback(?int?nCode,?IntPtr?wParam,?IntPtr?lParam) ?????? { ???????????if?(IntPtr?.Zero == HookPtr ||?null?== HookId) ?????????? { ???????????????return?0; ?????????? } ???????????if?(nCode >= 0) ?????????? { ???????????????if?(null?!= HookCallbackEvent) ?????????????? { ???????????????????return?HookCallbackEvent(nCode, wParam, lParam); ?????????????? } ?????????? } ???????????return?CallNextHookEx(HookPtr, HookId.Value, wParam, lParam); ?????? } ???????public?static?IntPtr?SetWindowsHookEx() ?????? { ???????????if?(null?== HookId) ?????????? { ???????????????throw?new?Exception(?"You must set HookId first!"?); ?????????? } ?????????? HookPtr = SetWindowsHookEx( ?????????????? HookId.Value, ?????????????? KeyboardCallback, ?????????????? Instance, ?????????????? 0); ???????????return?HookPtr; ?????? } ???????public?static?bool?UnhookWindowsHookEx() ?????? { ???????????if?(null?== HookPtr ||?IntPtr.Zero == HookPtr) ?????????? { ???????????????throw?new?Exception(?"HookPtr is null"); ?????????? } ???????????return?UnhookWindowsHookEx(HookPtr); ?????? } ???????public?static?int?WH_KEYBOARD_LL = 13; ???????public?static?IntPtr?HookPtr; ???????public?static?int? HookId = WH_KEYBOARD_LL; ???????public?static?event?HookProc?HookCallbackEvent; ???????public?static?HookProc?KeyboardCallback =?new?HookProc?(HookHelper.HookCallback); ???????public?static?IntPtr?Instance =?Marshal.GetHINSTANCE(Assembly?.GetAssembly(typeof(?HookHelper)).GetModules()[0]); ?????? #region?Win32API ?????? [?DllImport("User32.dll"?, CharSet =?CharSet.Unicode, CallingConvention =?CallingConvention.StdCall, ?????????? SetLastError =?true)] ???????public?static?extern?IntPtr?SetWindowsHookEx( ???????????int?idHook, ???????????HookProc?lpfn,?//如果是全局鉤子,回調函數應該就寫在dll內 ???????????IntPtr?hMod,???//如果是全局鉤子,應該是包含lpfn方法的dll句柄,注意此句柄要保持生命周期 ???????????int?dwThreadId?//如果是全局鉤子,置為0;否則應該是保護lpfn方法的進程id ?????????? ); ?????? [?DllImport("User32.dll"?, CharSet =?CharSet.Unicode, CallingConvention =?CallingConvention.StdCall, ?????????? SetLastError =?true)] ???????public?static?extern?int?CallNextHookEx( ???????????IntPtr?hhk, ???????????int?nCode, ???????????IntPtr?wParam, ???????????IntPtr?lParam ?????????? ); ?????? [?DllImport("User32.dll"?, CharSet =?CharSet.Unicode, CallingConvention =?CallingConvention.StdCall, ?????????? SetLastError =?true)] ???????public?static?extern?bool?UnhookWindowsHookEx( ???????????IntPtr?hhk ?????????? ); ?????? [?DllImport("Kernel32.dll"?, CharSet =?CharSet.Unicode, CallingConvention =?CallingConvention.StdCall)] ???????public?static?extern?int?GetLastError(); ?????? #endregion ?? } } ? ? HookHelper的用法: 1.可以使用原始的win32 api,如 public?static?extern?IntPtr?SetWindowsHookEx( ???????????int?idHook, ???????????HookProc?lpfn, ???????????IntPtr?hMod, ???????????int?dwThreadId ?????????? ); 2.可以使用包裝好的2個方法,只要外部指定要處理的HookId(安裝何種類型的鉤子),以及處理鉤子的回調函數HookCallbackEvent, 如 private?void?MainView_Loaded?(object?sender,?System?.Windows.?RoutedEventArgs?e?) ?????? { ???????????//Add hook ???????????HookHelper.HookCallbackEvent?+=?F5Proc; ???????????HookHelper.HookId?=?HookHelper.?WH_KEYBOARD_LL; ???????????HookHelper.SetWindowsHookEx?(); ?????? } 注意事項: 1.如果是全局鉤子,請把鉤子的回調處理函數放在dll中 2.C#好像不支持wm_keyboard這樣的鉤子,需要替換為wm_keyboard_ll則可以 3.如果是全局鉤子,請務必把進程實例設為回調函數所在dll的實例。 4.請保證回調處理函數的生命周期,要不然被垃圾回收器回收后找不到調用函數。 Demo 下載地址:[http://download.csdn.net/detail/muzizongheng/8390369](http://download.csdn.net/detail/muzizongheng/8390369) [![](image/d41d8cd98f00b204e9800998ecf8427e.png)](#)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看