zoukankan      html  css  js  c++  java
  • windows api学习笔记键盘钩子

    DLL项目的头文件

    #ifdef KEYHOOKLIB_EXPORT //此宏将在CPP文件中定义
    #define KEYHOOKLIB_API __declspec(dllexport)
    #else
    #define KEYHOOKLIB_API __declspec(dllimport)
    #endif
    
    #define HM_KEY WM_USER+101
    
    BOOL KEYHOOKLIB_API WINAPI SetKeyHook(BOOL bInstall,DWORD dwThreadId = 0,HWND hWndCaller=NULL);
    

    DLL项目CPP文件

    #include <windows.h>
    #define KEYHOOKLIB_EXPORT
    #include "a.h"
    
    #pragma data_seg("MyShared")//用共享数据段来保存主窗口句柄和钩子句柄
    HWND g_hWndCaller = NULL;
    HHOOK g_hHook = NULL;
    #pragma data_seg()
    
    //通过内存地址取得模块句柄
    HMODULE WINAPI ModuleFromAddress(PVOID pv)
    {
    	MEMORY_BASIC_INFORMATION mbi;//此结构请查看MSDN
    	if(::VirtualQuery(pv,&mbi,sizeof(mbi)))
    	{
    		return (HMODULE)mbi.AllocationBase;
    	}
    	return NULL;
    }
    
    //钩子的回调函数
    LRESULT CALLBACK KeyHookProc(int nCode,//HOOK代码,钩子函数使用这个参数来确定任务
    							 WPARAM wParam,
    							 LPARAM lParam)
    {
    	if(nCode<0||nCode == HC_NOREMOVE)//没用的消息
    	{
    		return ::CallNextHookEx(g_hHook,nCode,wParam,lParam);
    	}
    	if(lParam&0x40000000)//消息重复
    	{
    		return ::CallNextHookEx(g_hHook,nCode,wParam,lParam);
    	}
    	::PostMessage(g_hWndCaller,WM_CLOSE,0,0);
    	return ::CallNextHookEx(g_hHook,nCode,wParam,lParam);
    }
    
    //给系统注册钩子
    BOOL WINAPI SetKeyHook(BOOL bInstall,DWORD dwThreadId,HWND hWndCaller)
    {
    	BOOL bOK;
    	g_hWndCaller = hWndCaller;
    	if(bInstall)
    	{
    		HMODULE temp = ModuleFromAddress(KeyHookProc);//钩子函数所在的DLL的实例句柄
    		g_hHook = ::SetWindowsHookEx(
    			WH_KEYBOARD,//键盘钩子标志
    			KeyHookProc,//回调函数
    			temp,
    			dwThreadId//线程句柄
    			);
    		if(g_hHook!=NULL)
    		{
    			bOK = TRUE;
    		}
    		else
    		{
    			bOK = FALSE; 
    		}
    	}
    	else
    	{
    		bOK = ::UnhookWindowsHookEx(g_hHook);//卸载钩子
    		g_hHook = NULL;
    	}
    	return bOK;
    }
    
    

    DLL项目的DEF文件

    LIBRARY	"gouzi"
    EXPORTS
    SetKeyHook
    SECTIONS
    MyShared Read Write Shared
    

    注册钩子的工程

    #include <windows.h>
    #include <iostream>
    #include "a1.h"//DLL中的头文件
    using namespace std;
    #pragma comment(lib,"gouzi")
    
    
    void main()
    {
    	::SetConsoleTitle("aaa");
    	//HWND hWnd = ::FindWindow(NULL,"Our First Window");
    	HWND hWnd = ::FindWindow("notepad",NULL);
    	//::SendMessage(hWnd,HM_KEY,)
    	if(!SetKeyHook(TRUE,0,hWnd))
    	{
    		cout<<"安装钩子失败"<<endl;
    		return;
    	}
    	char a;
    	while(true)
    	{
    		cin>>a;
    		if(a == 'u')
    		{
    			SetKeyHook(FALSE,0,hWnd);
    			return;
    		}
    	}
    	return;
    }
    
  • 相关阅读:
    SSH_框架整合2—查询显示
    SSH_框架整合1
    eclipse中tomcat发布失败(Could not delete May be locked by another process)原因及解决办法
    错误:javax.servlet.jsp.PageContext can not be to a type
    链表【6】
    欢迎使用CSDN-markdown编辑器
    剑指offer系列62---两个链表的公共结点
    剑指offer系列61---数组中的逆序对
    Git常用命令大全
    vue脚手架搭建的具体步骤
  • 原文地址:https://www.cnblogs.com/liulun/p/1666047.html
Copyright © 2011-2022 走看看