孙鑫老师VC笔记 下载本文

内容发布更新时间 : 2024/5/5 21:20:21星期一 下面是文章的全部内容请认真阅读。

g_hWnd=m_hWnd;

g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());设置了鼠标钩子

g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());设置了键盘钩子 3.完成钩子函数的编写: 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时程序可以退出,这是留的后门。否则程序无法关闭,只能用任务管理器来关闭它了。 {

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

UnhookWindowsHookEx(g_hKeyboard);当程序退出时最好将钩子移除。 UnhookWindowsHookEx(g_hMouse); } return 1; }

3.编写一个屏屏蔽所有进程和所有线程的钩子程序。此时这个钩子必须安装在DLL中,然后被

某个程序调用才行。

1.新建一个DLL工程名为Hook 2.增加Hook.cpp 3.代码如下:

#i nclude 包含头文件 HHOOK g_hMouse=NULL; HHOOK g_hKeyboard=NULL;

#pragma data_seg(\新建了一个节,用于将下 面的这个变量设为全局共享。 HWND g_hWnd=NULL;这个变量是全局共享的。 #pragma data_seg()

//#pragma comment(linker,\/*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;拦截了鼠标消息。 }

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);当退出时将钩子卸掉。

UnhookWindowsHookEx(g_hKeyboard); } return 1; }

void SetHook(HWND hwnd)此函数设置了钩子。 {

g_hWnd=hwnd;注意这种传递调用它的进程的句柄的方法,比较巧妙!

g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle(\g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle(\k\}

Hook.DEF的代码如下: LIBRARY Hook EXPORTS SetHook @2 SEGMENTS

MySec READ WRITE SHARED 也可以设置节的属性。

4.新建一个工程调用此钩子函数。工程名为HookTest,基于对话框的。在OnInitDialog()中调用SetHook(),要事先声明_declspec(dllimport) void SetHook(HWND hwnd);

然后在Project->Setting->Link->加入..\\Hook\\Debug\\Hook.lib,并将Hook.Dll拷贝到当前目录。 int cxScreen,cyScreen;

cxScreen=GetSystemMetrics(SM_CXSCREEN); cyScreen=GetSystemMetrics(SM_CYSCREEN);

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

SetHook(m_hWnd);

5.DLL的调试方法,设置断点,然后运行时断点时,step into即可。 4.数据库编程

1.ODBC,ADO简介:ADO可以认为是建立在ODBC上的。 ADO的三个核心对象 Connection对象

Connection对象表示了到数据库的连接,它管理应用程序和数据库之间的通信。 Recordset和Command对象都有一个ActiveConnection属性,该属性用来引用Connection对象。 Command对象

Command对象被用来处理重复执行的查询,或处理需要检查在存储过程调用中的输出或返回参数的值的查询。 Recordset对象

Recordset对象被用来获取数据。 Recordset对象存放查询的结果,这些结果由数据的行(称为

记录)和列(称为字段)组成。每一列都存放在Recordset的Fields集合中的一个Field对象中。 2.演示在VB中使用ADO的方法,方法比较简单,使用方便。另外在VB中演示了Connection和Command和Recordset的方法,用这三种方法都可以执行SQL语句。 3.在VC中利用ADO访问数据库。 1.新建一个基于对话框的工程,名为ADO。 2.在对话框中放一ListBox和一个Button控件。

3.在使用时须导入MSADO15.dll,方法是在StdAfx.h中#import \Files\\Common Files\\System\\ado\\msado15.dll\no_namespace rename(\

至少于将EOF改名为rsEOF,是为了避免与文件中的EOF重名。然后编译程序,将产生的debug目录下的两个文件MSADO15.tlh和MSADO15.tli加到工程中,其目的只是方便我们查看而已。并不是编译需要它。

ADO也是COM组件,须初始化COM库方法是CoInitialize(NULL);使用完后须CoUninitialize(); 代码如下:

void CAdoDlg::OnBtnQuery() {

// TOD Add your control notification handler code here CoInitialize(NULL);初始化

_ConnectionPtr pConn(__uuidof(Connection));产生connection智能指针 _RecordsetPtr pRst(__uuidof(Recordset));产生recordset智能指针 _CommandPtr pCmd(__uuidof(Command));产生command智能指针

pConn->ConnectionString=\Security Info=False;User ID=sa;Initial Catalog=pubs\数据库信息

pConn->Open(\打开数据库

//pRst=pConn->Execute(\* from authors\用记录集查询数据 //pRst->Open(\* from authors\// adOpenDynamic,adLockOptimistic,adCmdText);

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

pCmd->CommandText=\* from authors\用这种方法也可以查询数据 pRst=pCmd->Execute(NULL,NULL,adCmdText); while(!pRst->rsEOF)将查询到的数据加到列表框咯。 {

((CListBox*)GetDlgItem(IDC_LIST1))->AddString( (_bstr_t)pRst->GetCollect(\pRst->MoveNext(); }

pRst->Close(); pConn->Close(); pCmd.Release();

pRst.Release(); pConn.Release(); CoUninitialize();