循序渐进DLL编程(五)
在前面都是学习关于DLL的,接下来需要对DLL的编程的使用进行一些分析,接下来的文章中编程使用钩子
DLL文件
//DllMain.h #pragma once #define DLL_EXPORT __declspec(dllexport) extern "C" DLL_EXPORT BOOL WINAPI Start(); extern "C" DLL_EXPORT void WINAPI Stop();
//DllMain.cpp #include <windows.h> #include "Dllmain.h" #include<stdio.h> #pragma data_seg("Shared") HHOOK mhook = NULL; HINSTANCE hInstance = NULL; #pragma data_seg() LRESULT WINAPI KeyProc(int code, WPARAM wParam, LPARAM lParam) { if(code == HC_ACTION && (lParam& 0xc000ffff)) { char* sName = "It's a"; if(wParam == 'A') //这个地方只是简单的处理,如果需要进行键盘键入字符的分析可以加上 switch,还有bool flag = GetAsyncKeyState(VK_SHIFT)>>(sizeof(short)*8 -1);来判断是否有SHIFT输入。 { HWND hWnd = ::GetForegroundWindow(); MessageBox(hWnd,TEXT("haha"),TEXT("Keyboard"),MB_OK); } char s[10]; sprintf(s,"%c",wParam); MessageBox(NULL,s,TEXT("Keyboard"),MB_OK); } return false; } BOOL __stdcall DllMain(HANDLE hModule, DWORD ul_reason_for_call ,LPVOID lpReserved) { switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: hInstance = (HINSTANCE)hModule; break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return true; } BOOL WINAPI Start() { if(mhook != NULL) { return false; } mhook = ::SetWindowsHookEx(WH_KEYBOARD, KeyProc, hInstance, 0); //钩子的安装,参数分别是 钩子类型、钩子函数地址(函数名)、钩子函数所在DLL的实例句柄、哪个线程安装钩子 return (mhook!= NULL); } void WINAPI Stop() { ::UnhookWindowsHookEx(mhook); mhook=NULL; }
使用的DLL文件主要是采用基于Dialog的MFC程序,在加载钩子程序的调用Start 卸载钩子的时候调用Stop
//HookDlg #pragma comment(lib,"..\\debug\\Dllmain.lib"); #include"..\\Dllmain\\dllmain.h" void CHookDlg::OnBnClickedButtonHook() //添加hook { AfxMessageBox("钩子代码"); // TODO: 在此添加控件通知处理程序代码 Start(); } void CHookDlg::OnBnClickedButtonUnhook() //卸载钩子 { // TODO: 在此添加控件通知处理程序代码 Stop(); }
详细的代码见文件中压缩代码
我想做我自己
posted on 2013-01-27 20:03 AAAAAApple 阅读(246) 评论(0) 编辑 收藏 举报