Hook和数据库访问

1.安装Hook过程屏蔽鼠标键盘消息

新建一个基于对话框的MFC应用程序,取名InnerHook,CInnerHookDlg类上的OnInitDialog函数中安装Hook过程,编辑InnerHookDlg.cpp,如下:

//全局变量,用来保存键盘钩子过程的句柄 
HHOOK g_hKeyboard=NULL; 
HHOOK g_hMouse=NULL; 
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))) 
        return 1; 
    else 
        return CallNextHookEx(g_hKeyboard,code,wParam,lParam); 
*/ 
    if(VK_F2==wParam) 
    { 
        ::SendMessage(g_hWnd,WM_CLOSE,0,0); 
        UnhookWindowsHookEx(g_hKeyboard);//
移除hook过程 
        UnhookWindowsHookEx(g_hMouse); 
    } 
    return 1
}
 
 
BOOL CInnerHookDlg::OnInitDialog() 

    ......... 
    ......... 
    // TODO: Add extra initialization here 
    g_hWnd=m_hWnd; 
    g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());//
安装鼠标钩子过程  
    g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());//
安装键盘钩子过程 
    return TRUE;  // return TRUE  unless you set the focus to a control 
}

 

2.屏蔽所有的进程与线程的键盘和鼠标消息

    钩子过程dll

新建一个空的动态链接库工程,取名Hook,并新建一个C++源文件,也取名Hook,编辑:

#include  
HHOOK g_hMouse; 
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

 
void SetHook() 

    //SetWindowsHookEx(WH_MOUSE,MouseProc,g_hInst,0);    //
方式一 
    g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);//
方式二 
    //
安装鼠标钩子过程与当前的所有进程相关,并返回钩子过程的句柄给g_hMouse; 
    //
其中GetModuleHandle是得到动态链接库模块的句柄
}

 

再在Hook工程目录下,新建一个def文件,取名Hook.def,添加到工程,编辑:

LIBRARY Hook

EXPORTS

SetHook        @2

 

    调用Hook.dll的客户端程序

新建一个MFC基于单文档的应用程序,在HookTestDlg.cpp中编辑:

// CHookTestDlg message handlers 
#pragma comment(lib,"..//Hook//Debug//Hook.lib")//
引入库文件 
_declspec(dllimportvoid SetHook();//
声明这个函数是从动态链接库中引入的 
BOOL CHookTestDlg::OnInitDialog() 

    .......... 
    .......... 
    // TODO: Add extra initialization here 
    SetHook();//
调用这个Hook.dll中的函数,安装钩子过程 
    return TRUE;  // return TRUE  unless you set the focus to a control 
}

 

    键盘钩子

Hook.cpp中添加:

#include  
HHOOK g_hMouse=NULL; 
HHOOK g_hKeyboard=NULL; 
HWND g_hWnd;//
定义一个全局的句柄用来存放Hook.dll的句柄 
 
LRESULT CALLBACK MouseProc( 
  int nCode,      // hook code 
  WPARAM wParam,  // message identifier 
  LPARAM lParam   // mouse coordinates 
)//
鼠标钩子过程 

    return 1

 
LRESULT CALLBACK KeyboardProc( 
  int nCode,      // hook code 
  WPARAM wParam,  // message identifier 
  LPARAM lParam   // mouse coordinates 
)//
键盘钩子过程 

    if(VK_F2==wParam) 
    { 
        SendMessage(g_hWnd,WM_CLOSE,0,0);//
发送关闭窗口的消息 
        UnhookWindowsHookEx(g_hMouse);//
移除鼠标钩子 
        UnhookWindowsHookEx(g_hKeyboard);//
移除键盘钩子 
    } 
    return 1
}
 
 
void SetHook(HWND hwnd)//
通过一个参数将这个Hook.dll句柄传进来 

    g_hWnd=hwnd; 
    //SetWindowsHookEx(WH_MOUSE,MouseProc,g_hInst,0);    //
方式一 
    g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);//
方式二 
    //
安装鼠标钩子过程与当前的所有进程相关,并返回钩子过程的句柄给g_hMouse; 
    //
其中GetModuleHandle是得到动态链接库模块的句柄 
    g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0); 
}

 

HookTestDlg.cpp中编辑:

#pragma comment(lib,"..//Hook//Debug//Hook.lib")//引入库文件 
_declspec(dllimportvoid SetHook(HWND hwnd);//
声明这个函数是从动态链接库中引入的 
 
BOOL CHookTestDlg::OnInitDialog() 

    ........... 
    ........... 
    SetHook(m_hWnd);//
调用这个Hook.dll中的函数,安装钩子过程 
    return TRUE;  // return TRUE  unless you set the focus to a control 
}

 

3.设置窗口最顶层且最大化

编辑CHookTestDlg::OnInitDialog函数:

BOOL CHookTestDlg::OnInitDialog() 

    ............ 
    ............     
    // TODO: Add extra initialization here 
    int cxScreen,cyScreen; 
    cxScreen=GetSystemMetrics(SM_CXSCREEN);//
获取屏幕的宽度 
    cyScreen=GetSystemMetrics(SM_CYSCREEN);//
获取屏幕的高度 
    SetWindowPos(&wndTopMost,0,0,cxScreen,cyScreen,SWP_SHOWWINDOW);//
设置窗口的大小 
    SetHook(m_hWnd);//
调用这个Hook.dll中的函数,安装钩子过程 
    return TRUE;  // return TRUE  unless you set the focus to a control 
}

 

4.利用节关闭非当前窗口

Hook.cpp中编辑:

#include  
HHOOK g_hMouse=NULL; 
HHOOK g_hKeyboard=NULL; 
 
#pragma data_seg("MySec")//
创建一个名字为MySec的节 
//
注意:节的名字要在8个字符以内,超出部分被截掉 
HWND g_hWnd=NULL;//
定义一个全局的句柄用来存放Hook.dll的句柄 
#pragma data_seg() //
节的结尾,这样成员变量g_hWnd就在MySec这个节当中了 
//
注意:只有被初始化了的变量才会被放置在节当中 
 
//
MySec这个节设置成共享的节 
//
方式一 
//#pragma comment(linker,"/section:MySec,RWS")//
设置这个节为读写共享(RWS) 
//
方式二:在def文件当中添加 
/* 
SEGMENTS 
MySec    READ WRITE SHARED 
*/
 
.......... 
..........

Hook.def文件中添加:

SEGMENTS 
MySec    READ WRITE SHARED 

编译后,将Hook.dll文件拷贝到HookTest工程下,然后再次运行HookTest测试程序,再按Alt+Tab键切换到其这程序下,按F2,测试程序依然退出了。

 

5.数据库的编程

VB中利用ADO访问数据库

新建一VB工程,向窗体添加两个控件(ADO Data Control 6.0)(DataGrid Control 6.0),并拖到表单中,在Adodc1上点右键->属性->使用连接字符串(生成)->{提供程序(OLE DB Provider for SQL Server),连接[(用户名:sa,密码:luwei),数据库(test)]}->确定->记录源->命令类型(2-adCmdTable)->确定。 DataGrid控件的数据源选择Adodc1,运行,可以看到数据在DataGrid表控件中

    再新建一个VB工程,向窗体拖入一个列表框和按钮,双击按钮,编辑:

Private Sub Command1_Click() 
Dim conn As New ADODB.Connection 
'
定义连接对象 
 
'Dim rst As ADODB.Recordset 
'
定义记录集对象 
Dim rst As New ADODB.Recordset 
 
Dim cmd As New ADODB.Command 
'
定义Command对象 
 
conn.ConnectionString = "Provider=SQLOLEDB.1;Password=luowei;Persist Security Info=True;User ID=sa;Initial Catalog=test" 
'
给连接字串赋值 
conn.Open 
 
'
方式一 
'Set rst = conn.Execute("select * from S") 
'
方式二 
'rst.ActiveConnection = conn 
'rst.Open ("select * from S") 
'
方式三 
cmd.ActiveConnection = conn 
cmd.CommandText = "select * from S" 
Set rst = cmd.Execute 
 
Do Until rst.EOF 
    List1.AddItem rst("sname"
    rst.MoveNext 
'    
循环取数据 
Loop 
End Sub

运行,OK !!

 

VC中利用ADO访问数据库

    新建一个基于对话框的MFC应用程序,取名:Ado,然后在对话框资源上添加一个列表框与按钮(id: IDC_BTN_QUERY,Caption:查询),双击,添加消息响应函数.

首先在预编译头文件中添加:

#import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace 
//
导入ADO动态链接库

编译,将生成的msado15.tlhmsado15.tli导入到工程中,以便查看。

然后再编辑按钮的消息响应函数,如下:

void CAdoDlg::OnBtnQuery()  

    // TODO: Add your control notification handler code here 
    CoInitialize(NULL);//
初始化COM 
    _ConnectionPtr pConn(__uuidof(Connection));//
产生一个Connection智能指针对象 
    _RecordsetPtr pRst(__uuidof(Recordset));//
产生一个记录集的智能指针对象 
    _CommandPtr pCmd(__uuidof(Command));//
产生一个Command智能指针对象 
     
    pConn->ConnectionString="Provider=SQLOLEDB.1;Password=luowei;Persist Security Info=True;User ID=sa;Initial Catalog=test"
    //
通过连接字符串连接数据库 
    pConn->Open("","","",adConnectUnspecified);//
打开数据库 
     
    //
方式一 
    //pRst=pConn->Execute("select * from S",NULL,adCmdText); 
 
    //
方式二 
    //pRst->Open("select * from S",_variant_t((IDispatch*)pConn),adOpenDynamic,adLockOptimistic,adCmdText); 
 
    //
方式三 
    pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));//
设置活动连接 
    pCmd->CommandText="select * from S";//
设置命令文本 
    pRst=pCmd->Execute(NULL,NULL,adCmdText); 
 
    while(!pRst->rsEOF) 
    { 
        ((CListBox*)GetDlgItem(IDC_LIST1))->AddString( 
            (_bstr_t)pRst->GetCollect("sname")); 
        pRst->MoveNext();//
游标向下移 
    } 
    pRst->Close();//
关闭记录集 
    pConn->Close();//
关闭连接 
    pRst.Release();//
释放智能指针在引用接口上的使用记数 
    pConn.Release(); 
    CoUninitialize();//
卸载COM 
}

 

运行 ok!!

你可能感兴趣的:(VC++)