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(dllimport) void 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(dllimport) void 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.tlh与msado15.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!!