国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

重定義鍵盤的2種完成辦法

重定義鍵盤的2種完成辦法

更新時間:2022-04-30 文章作者:未知 信息來源:網絡 閱讀次數:

在windows操作系統中,如果我們想對鍵盤進行重定義,比如說按某鍵就可發直接上網,按某鍵可以直接關閉窗口等等,如何實現呢!在Visual C++中用常規class wizard方法是不可以實現的,這里我們用兩種方法去實現它。

方法1:利用RegisterHotKey函獲數實現

程序實現原理:首先用戶預定一個熱鍵,無論該程序是前臺程序還是后臺程序,只
要用戶按了這個鍵,就執行我們定義好的函數。程序中要對熱鍵消息WM_HOTKEY進行
捕獲,并通過消息參數了解哪一個鍵被按下。
    因為VC中的CLASSWIZARD中沒有對消息WM_HOTKEY進行封裝,我們只有通過手工加入代碼實現。該消息的映射及處理。

  具體實現步驟如下:

l         1 用MFC AppWizard建立一個工程名為:HotKey基于Dialog base的對話框程序,點擊finish。



l         2 聲明熱鍵消息處理函數原型
  在HotKeyDlg.h中消息映射聲明處(AFX_mSG字樣之后)加入如下語句(其中畫線部分是加入的代碼):

// Generated message map functions

       //{{AFX_MSG(CHotKeyDlg)

       virtual BOOL OnInitDialog();

       afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

       afx_msg void OnPaint();

       afx_msg HCURSOR OnQueryDragIcon();

       LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);

       //}}AFX_MSG

           DECLARE_MESSAGE_MAP()

l         3 消息與相應處理函數相關聯 在HotKeyDlg.Cpp中加入消息映射宏,使消息與相應處理函數發生關系,加入如下語句(其中畫線部分是加入的代碼):

BEGIN_MESSAGE_MAP(CHotKeyDlg, CDialog)

       //{{AFX_MSG_MAP(CHotKeyDlg)

       ON_WM_SYSCOMMAND()

       ON_WM_PAINT()

       ON_WM_QUERYDRAGICON()

       ON_MESSAGE(WM_HOTKEY,OnHotKey)

       //}}AFX_MSG_MAP

END_MESSAGE_MAP()

l         4 為方便以后的操作預先在CHotKeyDlg類中利用CLASSWIZARD實現一個響應WM_CREATE和WM_DESTROY消息的函數OnCreate( )與OnDestroy( )的框架,(利用CLASSWIZARD很容易實現,請參考有關VC的書籍,在此不再贅述)。

l         5 向系統登記熱鍵

  在OnCreate()函數中加入如下代碼以向系統登記熱鍵,本例子的熱鍵設為ESC.     

RegisterHotKey(m_hWnd,1001,NULL, VK_ESCAPE);

//函數參數請參考有關VC的書籍,在此不再贅述

l         6 處理熱鍵

在消息處理函數OnHotKey()中對熱鍵進行處理,并可加入用戶希望運行的程序代碼等:
     (注下面代碼是在HotKeyDlg.cpp中完全用手工加入的代碼)

     LRESULT CHotKeyDlg::OnHotKey(WPARAM wParam,LPARAM lParam)

{

       HWND hwnd;

       hwnd=::GetForegroundWindow();

       ::PostMessage(hwnd,WM_CLOSE,0,0);

       return 0;

}

l         7 程序運行完畢后解除熱鍵

在OnDestroy()中通過UnRegisterHotKey()解除熱鍵登記,釋放系統資源.

  UnregisterHotKey( m_hWnd, 1001);

l         8 編譯并運行程序
  運行程序后,無論何時只要按下熱鍵Esc后本程序便立關閉當前的窗口。

方法2:利用鍵盤鉤子函獲數實現

說到鉤子函數,可能對許多初學編程的人很陌生,我這里就多說幾句:

WINDOW的消息處理機制為了能在應用程序中監控系統的各種事件消息,提供了掛接

各種反調函數(HOOK)的功能。這種掛鉤函數(HOOK)類似擴充中斷驅動程序,掛鉤

可以掛接多個反調函數構成一個掛接函數鏈。系統產生的各種消息首先被送到各種

掛接函數,掛接函數根據各自的功能對消息進行監視、修改和控制等,然后交還控

制權或將消息傳遞給下一個掛接函數以致最終達到窗口函數。WINDOW系統的這種反

調函數掛接方法雖然會略加影響到系統的運行效率,但在很多場合下是非常有用

的,通過合理有效地利用鍵盤事件的掛鉤函數監控機制可以達到預想不到的良好效果。

l         1 在WINDOW下可進行掛接的過濾函數包括11種:

WH_CALLWNDPROC 窗口函數的過濾函數

WH_CBT 計算機培訓過濾函數

WH_DEBUG 調試過濾函數

WH_GETMESSAGE 獲取消息過濾函數

WH_HARDWARE 硬件消息過濾函數

WH_JOURNALPLAYBACK 消息重放過濾函數

WH_JOURNALRECORD 消息記錄過濾函數

WH_MOUSE 鼠標過濾函數

WH_MSGFILTER 消息過濾函數

WH_SYSMSGFILTER 系統消息過濾函數

WH_KEYBOARD 鍵盤過濾函數

WH_KEYBOARD_LL在WindowsNt4.0以上可用的鍵盤過濾函數

WH_MOUSE_LL 在WindowsNt4.0以上可用的鼠標過濾函數

l           2 其中鍵盤過濾函數是最常用最有用的過濾函數類型,不管是哪一種類型的過濾函

數,其掛接的基本方法都是相同的。

WINDOW調用掛接的反調函數時總是先調用掛接鏈首的那個函數,因此必須將鍵盤掛

鉤子函數利用函數SetWindowsHookEx()將其掛接在函數鏈首。至于消息是否傳遞給函

數鏈的下一個函數是由每個具體函數功能確定的,如果消息需要傳統給下一個函

數,可調用API函數的CallNextHookEx()來實現,如果不傳遞直接返回即可。

l         在程序中可以利用函數SetWindowsHookEx()來掛接過濾函數,在掛接函數時必須指

出該掛接函數的類型、函數的入口地址以及函數是全局性的還是局部性的,掛接函

數的具體調用格式如下:

HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId);

其中,第一個參數是鉤子的類型;第二個參數是鉤子函數的地址;第三個參數是包

含鉤子函數的模塊句柄;第四個參數指定監視的線程。如果指定確定的線程,即為

線程專用鉤子;如果指定為空,即為全局鉤子。其中,全局鉤子函數必須包含在DLL

(動態鏈接庫)中,而線程專用鉤子還可以包含在可執行文件中。得到控制權的鉤子

函數在完成對消息的處理后,如果想要該消息繼續傳遞,那么它必須調用另外一個

SDK中的API函數CallNextHookEx來傳遞它。鉤子函數也可以通過直接返回TRUE來丟

棄該消息,并阻止該消息的傳遞。

的確如果函數是全局性的,那么它必須放在一個DLL(動態鏈接庫)中,但是我發現在

window 2000以上的版本中,不用寫 DLL(動態鏈接庫)就可以作出全局性的鍵盤函數。用它可以做很多事情。

UnhookWindowsHookEx(int idHook)函數即可實現對掛接鉤子的卸載。

l         我們開始寫程序吧!用MFC AppWizard建立一個工程名為: KBoardHook基于Dialog base的對話框程序,點擊finish。

l         在KBoardHookDlg.cpp的最上邊加上

HHOOK hhkLowLevelKybd2000;

hhkLowLevelKybd2000為全局變量。

l         為方便以后的操作預先在CKBoardHookDlg類中利用CLASSWIZARD實現一個響應WM_CREATE和WM_DESTROY消息的函數OnCreate( )與OnDestroy( )的框架,

l         在OnCreate()函數中通過SetWindowsHookEx與系統掛起鉤子代碼如下

hhkLowLevelKybd2000  = SetWindowsHookEx(WH_KEYBOARD_LL,

       LowLevelKeyboardProc,      AfxGetApp()->m_hInstance, 0);

l         在OnDestroy()中通過UnhookWindowsHookEx ()解除已經掛起鉤子,釋放系統資源, 代碼如下:        UnhookWindowsHookEx(hhkLowLevelKybd2000);

l         這時在KBoardHookDlg.h中聲明LowLevelKeyboardProc ,在class CKBoardHookDlg : public Cdialog的上面加入如下代碼

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);

// 當nCode為0(在winuser.h中有如下定義:#define HC_ACTION  0)時wParam, lParam才包含所應有的鍵盤信息,wParam的值代表了鍵盤的消息可以為WM_KEYDOWN

WM_KEYUP, lParam為指向KBDLLHOOKSTRUCT的指針。



l         再在KBoardHookDlg.cpp的最后加入如下代碼(這此代碼都是手工加入的,不能用ClassWzrd)













LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)

{

              PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;

              if (nCode == HC_ACTION) {

                     int vKey=LOBYTE(p->vkCode);

                     switch (wParam)

                     {

                     case WM_KEYDOWN:

                            {

                                   if(vKey==27)

                                   {

                                          HWND hwnd;

                                          hwnd=::GetForegroundWindow();

                                          ::PostMessage(hwnd,WM_CLOSE,0,0);

                                   }

                            }

                     }

                     

              }

              return CallNextHookEx(NULL, nCode, wParam, lParam);

}

這時編譯程序,一共出了6個

其中前兩個錯是

error C2065: 'WH_KEYBOARD_LL' : undeclared identifier

error C2065: 'PKBDLLHOOKSTRUCT' : undeclared identifier

看看msdn 明明說可以有而且在winuser.h中定義了,我試著在KBoardHookDlg.cpp 的前面加入#include "winuser.h" ,但是結果還是一樣的,我們再追根到底再看看winuser.h,發現里面明明定義了WH_KEYBOARD_LL與PKBDLLHOOKSTRUCT,但是就是不好用,怎么辦呢?把它們找到,復制到KBoardHookDlg.h中原先手工加入的定義LowLevelKeyboardProc函數上面(下面就是我們要復制的代碼)

#define WH_KEYBOARD_LL     13

typedef struct tagKBDLLHOOKSTRUCT {

    DWORD   vkCode;

    DWORD   scanCode;

    DWORD   flags;

    DWORD   time;

    DWORD   dwExtraInfo;

} KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;

這時再編譯程序,程序就可以運行了。這樣我們就同樣實現了改變鍵盤的目的。



小結,上述兩種方法是不同的原理,其加載方法也不盡相同,對于第一種方法其實現可以在win98/win2000/winXP中都能通用,但對于第兩種方法,其只能在win2000/winXP中應用,如果相在win98中應用就要寫成dll進行調用,較為繁瑣,但是其功能是強大的,因為它是與系統進行了掛鉤,所以用戶在任何窗口下按鍵盤都會觸發它,例如我們想屏蔽鍵盤,只要把LowLevelKeyboardProc函數中的

return CallNextHookEx(NULL, nCode, wParam, lParam);

改為 return true;

就可以屏蔽除Ctrl+Alt+Del以外的所有按鍵。

至于為什么么在winuser.h中定義了那兩個量編譯時卻說沒定義,我也是百思不得其解,希望我寫這篇文章能拋磚引玉,激發大家學習vc的興趣。


注(作者同意作品進刊盤和網絡版)

聯系方式:大連理工大學電子系995班孫宇哲
Email:sunyuzhe@263.net
主頁:http://sunyuzhe.363.net
Tel:0411-4702214

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        av在线不卡电影| 国产精品视频一区二区三区不卡| 国产乱子轮精品视频| 色综合天天综合给合国产| 4438x成人网最大色成网站| 亚洲欧洲精品一区二区精品久久久| 国产精品主播直播| 久久亚洲精精品中文字幕早川悠里| 99视频在线精品| 亚洲色图色小说| 精品视频在线看| 久久99精品国产91久久来源| 欧美mv和日韩mv的网站| 国产一区二区h| 国产精品国产三级国产aⅴ入口 | 国产盗摄一区二区三区| 97aⅴ精品视频一二三区| 日韩精品中文字幕一区二区三区 | 日韩av电影免费观看高清完整版在线观看| 日韩女优制服丝袜电影| 精品国产sm最大网站| 国产欧美一区视频| 国产欧美久久久精品影院| 国产日产欧美精品一区二区三区| 成人免费视频在线观看| 美美哒免费高清在线观看视频一区二区 | 日韩小视频在线观看专区| 日韩精品一级二级 | 日韩一区二区三区观看| 成人在线视频一区二区| 亚洲成av人影院| 亚洲欧洲av另类| 久久只精品国产| 8v天堂国产在线一区二区| 91丨porny丨蝌蚪视频| 久久超碰97中文字幕| 五月综合激情网| 亚洲一区二区欧美日韩| 一区二区三区高清| 1区2区3区精品视频| 国产精品久久久99| 国产亚洲精久久久久久| 精品国产a毛片| 日韩精品一区二区三区三区免费| 在线观看91视频| 制服丝袜av成人在线看| 亚洲精品一线二线三线无人区| 欧美人xxxx| 2020国产精品| 国产精品蜜臀av| 午夜影院在线观看欧美| 日日夜夜精品视频天天综合网| 日本视频一区二区三区| 国产毛片精品一区| 97精品电影院| 91精品国产欧美一区二区| 精品国产乱码久久久久久夜甘婷婷| 日韩一区二区精品在线观看| 久久久九九九九| 亚洲成a人片在线观看中文| www激情久久| 一区二区理论电影在线观看| 日韩电影在线免费观看| 丁香啪啪综合成人亚洲小说| 91麻豆精品国产| 亚洲愉拍自拍另类高清精品| 国产一区二区免费看| 欧美老肥妇做.爰bbww视频| 国产色91在线| 国产专区综合网| 日韩一区二区三区高清免费看看| 亚洲欧美日韩成人高清在线一区| 激情六月婷婷综合| 精品欧美久久久| 精品一区二区国语对白| 91精品国产麻豆国产自产在线| 亚洲精品国产第一综合99久久| 成人午夜电影小说| 一区精品在线播放| 91丨九色丨蝌蚪丨老版| 国产精品久久福利| 91福利小视频| 免费成人小视频| 国产午夜三级一区二区三| 国产mv日韩mv欧美| 亚洲柠檬福利资源导航| 欧美视频一区二区三区四区| 亚洲成a人在线观看| 精品久久久久久久久久久久久久久久久 | 国产精品每日更新在线播放网址 | 免费日本视频一区| 精品少妇一区二区三区 | 久久国产免费看| 国产精品欧美一级免费| 欧洲亚洲国产日韩| 国产在线播放一区| 亚洲人成在线观看一区二区| 在线亚洲精品福利网址导航| 免费在线一区观看| 亚洲视频每日更新| 欧美一卡二卡在线观看| 91小宝寻花一区二区三区| 天涯成人国产亚洲精品一区av| 欧美不卡一区二区三区四区| 99综合影院在线| 国产在线精品免费| 日韩福利视频导航| 亚洲一区二区偷拍精品| 国产精品色在线| 国产午夜精品理论片a级大结局 | 99久久er热在这里只有精品66| 亚洲欧洲av在线| 欧美综合在线视频| 91国产丝袜在线播放| 亚洲免费资源在线播放| 精品一区二区av| 色综合一区二区| 欧美一级日韩一级| 日韩精品欧美精品| 成人妖精视频yjsp地址| zzijzzij亚洲日本少妇熟睡| 成人亚洲精品久久久久软件| 99久久精品情趣| 亚洲国产精华液网站w| 美日韩一级片在线观看| 日韩一区二区影院| 欧美亚一区二区| 五月综合激情婷婷六月色窝| 欧美一级黄色片| 色综合一个色综合亚洲| 色八戒一区二区三区| 欧美性videosxxxxx| 911精品国产一区二区在线| 日韩亚洲欧美高清| 国产亚洲欧美激情| 亚洲精品中文字幕乱码三区| 亚洲第一久久影院| 福利电影一区二区| 日韩一本二本av| 亚洲精品免费播放| 久久丁香综合五月国产三级网站| 成人国产精品免费网站| 日韩一区二区精品在线观看| 亚洲视频小说图片| 国产成人精品亚洲日本在线桃色| 一本色道久久综合精品竹菊| 精品剧情v国产在线观看在线| 国产精品色在线观看| 国内欧美视频一区二区| 91超碰这里只有精品国产| 国产精品久久毛片a| 国产在线麻豆精品观看| 91麻豆精品91久久久久久清纯| 欧美国产日本韩| 成人国产亚洲欧美成人综合网| 日韩欧美www| 国产一区二区在线看| 久久精品视频在线免费观看| 精品综合免费视频观看| 欧美tickling挠脚心丨vk| 激情综合一区二区三区| 国产欧美日韩激情| 不卡的av电影在线观看| 亚洲精品日韩综合观看成人91| 97久久精品人人做人人爽 | 亚洲国产成人av好男人在线观看| 91国偷自产一区二区开放时间| 亚洲免费色视频| 欧美精品粉嫩高潮一区二区| 另类小说色综合网站| 国产精品三级久久久久三级| 欧美系列在线观看| 极品美女销魂一区二区三区免费| 国产精品久久久久aaaa| 欧美年轻男男videosbes| 成人网在线免费视频| 午夜精品久久久久| 国产精品狼人久久影院观看方式| 欧美少妇xxx| 成人国产视频在线观看| 日本最新不卡在线| 亚洲视频在线观看三级| 久久精品亚洲精品国产欧美kt∨| 在线观看视频91| eeuss影院一区二区三区| 麻豆精品一二三| 三级欧美在线一区| 午夜电影一区二区三区| 亚洲综合自拍偷拍| 亚洲欧洲另类国产综合| 欧美日韩国产成人在线免费| 国产原创一区二区| 精品一区二区三区日韩| 麻豆传媒一区二区三区| 精品一区二区三区影院在线午夜| 日本网站在线观看一区二区三区| 亚洲一区二区三区视频在线播放| 日韩久久一区二区| 亚洲成av人片| 国内精品久久久久影院色|