循序渐进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编辑  收藏  举报

导航