zoukankan      html  css  js  c++  java
  • 循序渐进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();
    }

    详细的代码见文件中压缩代码

  • 相关阅读:
    jquery 代码搜集
    Windows Server 2008中安装IIS7.0
    javascript 判断两个日期之间的天数 兼容ie,firefox
    jquery选择器大全
    原始ajax方式调用asp.net后台方法
    JavaScript及C# URI编码详解
    利用JQuery直接调用asp.net后台方法
    C#操作XML小结_转载
    从bnbt tracker源码分析bt客户端与traker的通信
    传说中的神器: shared_ptr/weak_ptr/scoped_ptr
  • 原文地址:https://www.cnblogs.com/OneDream/p/2879022.html
Copyright © 2011-2022 走看看