• 循序渐进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();
    }

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

  • 相关阅读:
    python练习六十二:文件处理,往文件中所有添加指定的前缀
    python练习六十一:文件处理,读取文件内容
    使用广度优先搜素查找路径
    不同路径 II
    使用深度优先搜索查找路径
    不同路径
    深度优先搜索
    旋转链表
    java 迭代
    表示图的数据类型
  • 原文地址:https://www.cnblogs.com/OneDream/p/2879022.html
Copyright © 2020-2023  润新知