久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

MFC(HOOK和數(shù)據(jù)庫(kù)訪問(wèn),孫鑫C 第二十講筆記整理)

 筆錄收藏 2012-09-10

1.Hook簡(jiǎn)介:作用是攔截某些消息,,關(guān)鍵函數(shù)是SetWindowsHookEX()

 

2.示例程序:

  a.新建一基于對(duì)話框工程,,InnerHook,此過(guò)程的鉤子是只攔截本進(jìn)程的。

  b.OnInitDialog()中添加代碼:

   g_hWnd=m_hWnd;

 g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());設(shè)置了鼠標(biāo)鉤子

 g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());設(shè)置了鍵盤鉤子

 

  c.完成鉤子函數(shù)的編寫:

 HHOOK g_hKeyboard=NULL;

 HHOOK g_hMouse;

 HWND g_hWnd=NULL;

 

 LRESULT CALLBACK MouseProc(

   int nCode,      // hook code

   WPARAM wParam,  // message identifier

   LPARAM lParam   // mouse coordinates

 )

 {

  return 1;

 }

 

 LRESULT CALLBACK KeyboardProc(

   int code,       // hook code

   WPARAM wParam,  // virtual-key code

   LPARAM lParam   // keystroke-message information

 )

 {

  //if(VK_SPACE==wParam || VK_RETURN==wParam)如果是空格鍵

  /*if(VK_F4==wParam && (1==(lParam>>29 & 1)))攔截ALT+F4按鍵,!

   return 1;

  else

   return CallNextHookEx(g_hKeyboard,code,wParam,lParam);*/

  if(VK_F2==wParam)F2時(shí)程序可以退出,,這是留的后門。否則程序無(wú)法關(guān)閉,,只能用任務(wù)管理器來(lái)關(guān)閉它了,。

  {

   ::SendMessage(g_hWnd,WM_CLOSE,0,0);

   UnhookWindowsHookEx(g_hKeyboard);當(dāng)程序退出時(shí)最好將鉤子移除。

   UnhookWindowsHookEx(g_hMouse);

  }

  return 1;

 }

 

3.編寫一個(gè)屏屏蔽所有進(jìn)程和所有線程的鉤子程序,。此時(shí)這個(gè)鉤子必須安裝在DLL中,,然后被某個(gè)程序調(diào)用才行。

  a.新建一個(gè)DLL工程名為Hook

  b.增加Hook.cpp

  c.代碼如下:

 #include <windows.h>包含頭文件

 

 HHOOK g_hMouse=NULL;

 HHOOK g_hKeyboard=NULL;

 

 #pragma data_seg("MySec")新建了一個(gè)節(jié),,用于將下面的這個(gè)變量設(shè)為全局共享,。

 HWND g_hWnd=NULL;這個(gè)變量是全局共享的。

 #pragma data_seg()

 

 //#pragma comment(linker,"/section:MySec,RWS")

 /*HINSTANCE g_hInst;

 

 BOOL WINAPI DllMain(

   HINSTANCE hinstDLL,  // handle to the DLL module

   DWORD fdwReason,     // reason for calling function

   LPVOID lpvReserved   // reserved

 )

 {

  g_hInst=hinstDLL;

 }*/

 

 LRESULT CALLBACK MouseProc(

   int nCode,      // hook code

   WPARAM wParam,  // message identifier

   LPARAM lParam   // mouse coordinates

 )

 {

  return 1;攔截了鼠標(biāo)消息,。

 }

 

 LRESULT CALLBACK KeyboardProc(

   int code,       // hook code

   WPARAM wParam,  // virtual-key code

   LPARAM lParam   // keystroke-message information

 )

 {

  if(VK_F2==wParam)如果是F2鍵,,則退出。

  {

   SendMessage(g_hWnd,WM_CLOSE,0,0);

   UnhookWindowsHookEx(g_hMouse);當(dāng)退出時(shí)將鉤子卸掉,。

   UnhookWindowsHookEx(g_hKeyboard);

  }

  return 1;

 }

 

 void SetHook(HWND hwnd)此函數(shù)設(shè)置了鉤子,。

 {

  g_hWnd=hwnd;注意這種傳遞調(diào)用它的進(jìn)程的句柄的方法,比較巧妙,!

  g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);

  g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0);

 } Hook.DEF的代碼如下:

 LIBRARY Hook

 EXPORTS

 SetHook  @2

 SEGMENTS

 MySec READ WRITE SHARED 也可以設(shè)置節(jié)的屬性,。

    d.新建一個(gè)工程調(diào)用此鉤子函數(shù)。工程名為HookTest,基于對(duì)話框的,。在OnInitDialog()中調(diào)用SetHook(),,要事先聲明_declspec(dllimport) void SetHook(HWND hwnd);

     然后在Project->Setting->Link->加入..\Hook\Debug\Hook.lib,并將Hook.Dll拷貝到當(dāng)前目錄,。

 int cxScreen,cyScreen;

 cxScreen=GetSystemMetrics(SM_CXSCREEN);

 cyScreen=GetSystemMetrics(SM_CYSCREEN);

 SetWindowPos(&wndTopMost,0,0,cxScreen,cyScreen,SWP_SHOWWINDOW);將窗口保持在最前面,。

 SetHook(m_hWnd);

    e.DLL的調(diào)試方法,設(shè)置斷點(diǎn),,然后運(yùn)行時(shí)斷點(diǎn)時(shí),,step into即可。

 

4.數(shù)據(jù)庫(kù)編程

  a.ODBC,,ADO簡(jiǎn)介:ADO可以認(rèn)為是建立在ODBC上的,。

   ADO的三個(gè)核心對(duì)象

 Connection對(duì)象

   Connection對(duì)象表示了到數(shù)據(jù)庫(kù)的連接,它管理應(yīng)用程序和數(shù)據(jù)庫(kù)之間的通信,。 RecordsetCommand對(duì)象都有一個(gè)ActiveConnection屬性,,該屬性用來(lái)引用Connection對(duì)象,。

 Command對(duì)象

   Command對(duì)象被用來(lái)處理重復(fù)執(zhí)行的查詢,或處理需要檢查在存儲(chǔ)過(guò)程調(diào)用中的輸出或返回參數(shù)的值的查詢,。

 Recordset對(duì)象

   Recordset對(duì)象被用來(lái)獲取數(shù)據(jù),。 Recordset對(duì)象存放查詢的結(jié)果,這些結(jié)果由數(shù)據(jù)的行(稱為記錄)和列(稱為字段)組成,。每一列都存放在RecordsetFields集合中的一個(gè)Field對(duì)象中,。

  b.演示在VB中使用ADO的方法,方法比較簡(jiǎn)單,,使用方便,。另外在VB中演示了ConnectionCommandRecordset的方法,用這三種方法都可以執(zhí)行SQL語(yǔ)句,。

  c.VC中利用ADO訪問(wèn)數(shù)據(jù)庫(kù),。

    aa.新建一個(gè)基于對(duì)話框的工程,名為ADO,。

    bb.在對(duì)話框中放一ListBox和一個(gè)Button控件,。

    cc.在使用時(shí)須導(dǎo)入MSADO15.dll,方法是在StdAfx.h#import "D:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")

    至少于將EOF改名為rsEOF,,是為了避免與文件中的EOF重名。然后編譯程序,,將產(chǎn)生的debug目錄下的兩個(gè)文件MSADO15.tlhMSADO15.tli加到工程中,,其目的只是方便我們查看而已。并不是編譯需要它,。

    ADO也是COM組件,須初始化COM庫(kù)方法是CoInitialize(NULL);使用完后須CoUninitialize();

   代碼如下:

    void CAdoDlg::OnBtnQuery()

{

 // TOD Add your control notification handler code here

 CoInitialize(NULL);初始化

 _ConnectionPtr pConn(__uuidof(Connection));產(chǎn)生connection智能指針

 _RecordsetPtr pRst(__uuidof(Recordset));產(chǎn)生recordset智能指針

 _CommandPtr pCmd(__uuidof(Command));產(chǎn)生command智能指針 pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=pubs";數(shù)據(jù)庫(kù)信息

 pConn->Open("","","",adConnectUnspecified);打開數(shù)據(jù)庫(kù) //pRst=pConn->Execute("select * from authors",NULL,adCmdText);用記錄集查詢數(shù)據(jù)

 //pRst->Open("select * from authors",_variant_t((IDispatch*)pConn),

 // adOpenDynamic,adLockOptimistic,adCmdText);

 pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));

 pCmd->CommandText="select * from authors";用這種方法也可以查詢數(shù)據(jù)

 pRst=pCmd->Execute(NULL,NULL,adCmdText);

 while(!pRst->rsEOF)將查詢到的數(shù)據(jù)加到列表框咯,。

 {

  ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(

   (_bstr_t)pRst->GetCollect("au_lname"));

  pRst->MoveNext();

 }

 

 pRst->Close();

 pConn->Close();

 pCmd.Release();

 pRst.Release();

 pConn.Release();

 CoUninitialize();

}

 

下面是具體的步驟:

SetWindowsHookEx;

1新建一個(gè)基于對(duì)話框的MFC程序

2然后在其OnInitDialog中 添加

  1. SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());  


3在OnInitDialog前面添加MouseProc函數(shù)

  1. LRESULT CALLBACK MouseProc(  
  2.                            int nCode,      // hook code   
  3.                            WPARAM wParam,  // message identifier   
  4.                            LPARAM lParam   // mouse coordinates   
  5.                            )  
  6. {  
  7.     return 1;//表示已經(jīng)處理過(guò)了   
  8. }  


這樣運(yùn)行程序就不能用鼠標(biāo)控制,。

 

下面添加一個(gè)項(xiàng)目鍵盤的鉤子:

  1. HHOOK g_hkeyboard=NULL;//用來(lái)接收返回的HOOK句柄  


OnInitDialog函數(shù)中,

  1. g_hkeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());  


 

  1. LRESULT CALLBACK KeyboardProc(  
  2.                               int code,       // hook code   
  3.                               WPARAM wParam,  // virtual-key code   
  4.                               LPARAM lParam   // keystroke-message information   
  5.                               )  
  6. {  
  7.     return 1;  
  8. }  


這個(gè)時(shí)候,,運(yùn)行程序窗口,,既不能使用鼠標(biāo)又不能使用鍵盤。

  1. LRESULT CALLBACK KeyboardProc(  
  2.                               int code,       // hook code   
  3.                               WPARAM wParam,  // virtual-key code   
  4.                               LPARAM lParam   // keystroke-message information   
  5.                               )  
  6. {  
  7.     if(VK_SPACE==wParam||VK_RETURN==wParam)//屏蔽了空格鍵和回車鍵   
  8.         return 1;  
  9.     else  
  10.         return CallNextHookEx(g_hkeyboard,code,wParam,lParam);  
  11. }  


下面給回車留一個(gè)退路:

  1. HWND hwnd;//用來(lái)保存對(duì)話框的句柄  


OnInitDialog中接收

  1. hwnd=m_hWnd;  


 

  1. LRESULT CALLBACK KeyboardProc(  
  2.                               int code,       // hook code   
  3.                               WPARAM wParam,  // virtual-key code   
  4.                               LPARAM lParam   // keystroke-message information   
  5.                               )  
  6. {  
  7.     //if(VK_SPACE==wParam||VK_RETURN==wParam)//屏蔽了空格鍵和回車鍵   
  8.     if(VK_F2==wParam)  
  9.         ::SendMessage(hwnd,WM_CLOSE,wParam,lParam);  
  10.           
  11.     else  
  12.         return CallNextHookEx(g_hkeyboard,code,wParam,lParam);  
  13. }  


這個(gè)時(shí)候按F2就能退出了,。

  1. if(VK_F4&&(lParam>>29&1))  
  2. return 1;  

屏蔽Alt+F4退出的按鈕

可以使用

  1. UnhookWindowsHookEx  

來(lái)刪除鉤子

 

上面這些都是局部的鉤子,,下面設(shè)計(jì)一個(gè)全局的鉤子,需要用到dll文件

新建一個(gè)hook.dll文件

  1. #include<windows.h>   
  2.   
  3. LRESULT CALLBACK MouseProc(  
  4.                            int nCode,      // hook code   
  5.                            WPARAM wParam,  // message identifier   
  6.                            LPARAM lParam   // mouse coordinates   
  7.                            )  
  8. {  
  9.     return 1;  
  10. }  
  11.   
  12. void setHook()  
  13. {  
  14.     SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("hook"),0);  
  15. }  

也可以不使用GetModulHandle來(lái)獲取實(shí)例

而是

  1. #include<windows.h>   
  2. HINSTANCE hInst;  
  3. BOOL WINAPI DllMain(  
  4.   HINSTANCE hinstDLL,  // handle to the DLL module   
  5.   DWORD fdwReason,     // reason for calling function   
  6.   LPVOID lpvReserved   // reserved   
  7. )  
  8. {  
  9.     hInst=hinstDLL;  
  10. }  


hook.def

  1. LIBRARY hook  
  2. EXPORTS  
  3. setHook  @10086  


把這兩個(gè)復(fù)制到工程目錄下:

 

基于MFC的對(duì)話框中的

  1. #pragma comment(lib,"hook.lib")  

 

OnInitDialog函數(shù)前聲明:(也可以使用19章的方法,,動(dòng)態(tài)調(diào)用)

  1. _declspec(dllimportvoid setHook();  

OnInitDialog函數(shù)中,,調(diào)用

setHook();

結(jié)果就是,所有的線程都不能使用鼠標(biāo),。這個(gè)時(shí)候,,按回車或空格退出。


下面再添加一個(gè)全局的鍵盤鉤子


 

  1. #include<windows.h>   
  2. HHOOK hmouse=NULL;  
  3. HHOOK hkeyboard=NULL;  
  4. HWND hwndkey;  
  5. LRESULT CALLBACK MouseProc(  
  6.                            int nCode,      // hook code   
  7.                            WPARAM wParam,  // message identifier   
  8.                            LPARAM lParam   // mouse coordinates   
  9.                            )  
  10. {  
  11.     return 1;  
  12. }  
  13.   
  14. LRESULT CALLBACK KeyboardProc(  
  15.                               int code,       // hook code   
  16.                               WPARAM wParam,  // virtual-key code   
  17.                               LPARAM lParam   // keystroke-message information   
  18.                               )  
  19. {  
  20.     //不能簡(jiǎn)單的返回1,,這樣非逼你關(guān)機(jī)不可,還是得留一個(gè)后路好   
  21.     if(VK_F2==wParam)  
  22.     {  
  23.         SendMessage(hwndkey,WM_CLOSE,wParam,lParam);  
  24.         UnhookWindowsHookEx(hmouse);  
  25.         UnhookWindowsHookEx(hkeyboard);  
  26.     }  
  27.     else  
  28.     {  
  29.         return 1;  
  30.     }  
  31. }  
  32.   
  33.   
  34. void setHook(HWND hwnd)  
  35. {  
  36.     hwndkey=hwnd;  
  37.     hmouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("hook"),0);  
  38.     hkeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("hook"),0);  
  39. }  


 

OnInitDialog函數(shù)前聲明:(也可以使用19章的方法,動(dòng)態(tài)調(diào)用)

  1. _declspec(dllimportvoid setHook(HWND hwnd);  

OnInitDialog函數(shù)中,,調(diào)用

setHook(m_hWnd);

這樣,,鼠標(biāo)和鍵盤都沒(méi)有反應(yīng)了,只有F2是退出鍵,,但是當(dāng)用鍵盤的Alt+Tab組合的時(shí)候,,還是有挺多軟件可以使用鼠標(biāo)的

可以通過(guò)SetWindowPos函數(shù),講對(duì)話框窗口設(shè)置成最頂層窗口和全屏,,這樣Alt+Tab選中其他窗口的時(shí)候,,被最頂層窗口擋住了,(呵呵,,惡搞程序)

在OnInitDialog添加:

  1. int cxClient,cyClient;  
  2.     cxClient=GetSystemMetrics(SM_CXSCREEN);  
  3.     cyClient=GetSystemMetrics(SM_CYSCREEN);  
  4.     SetWindowPos(&wndTopMost,0,0,cxClient,cyClient,SWP_SHOWWINDOW);  
  5.     setHook(m_hWnd);  

 

可以使得用Alt+Tab切換到其他窗口(雖然看不見),,一樣可以F2刪除對(duì)話框

dll源文件:

  1. #pragma data_seg("MySec")   
  2. HWND hwndkey=NULL;  //添加一個(gè)結(jié),要初始化   
  3. #pragma data_seg()   
  4.   
  5. //#pragma comment(linker,"/setction:MySec,RWS")//設(shè)置共享節(jié)點(diǎn),,可讀,,可寫,共享  


或DEF文件添加一句

  1. SEGMENTS  
  2. MySec  READ  WRITE  SHARED  



這樣就是一個(gè)完美的惡搞程序了,,貼上一張熊貓燒香的圖片,并放在別的電腦開機(jī)啟動(dòng)文件夾里面,,,。,。。哇卡卡卡,,我不是這樣的人,,后果自負(fù)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多