1. 程式人生 > >SetWindowsHookEx設定全域性鍵盤鉤子

SetWindowsHookEx設定全域性鍵盤鉤子

vs2010新建一個空的win32專案取名dllhook

新建dllhook.def鍵入如下程式碼

LIBRARY dllhook

EXPORTS  
SetKeyBoardHook  @123

新建dllhook.h鍵入如下程式碼

#ifndef DLLHOOK_HEAD_FILE
#define DLLHOOK_HEAD_FILE
#include <Windows.h>

//匯出定義
#ifndef DLLHOOK_API
#ifdef  DLLHOOK_DLL
#define DLLHOOK_API _declspec(dllexport)
#else
#define DLLHOOK_API _declspec(dllimport)
#endif
#endif

//模組定義
#ifndef _DEBUG
#define DLLHOOK_DLL_NAME	TEXT("dll2.dll")			//元件名字
#else
#define DLLHOOK_DLL_NAME	TEXT("dll2D.dll")			//元件名字
#endif


bool SetKeyBoardHook(HWND hwnd);
//////////////////////////////////////////////////////////////////////////////////
//匯出檔案

#ifndef DLLHOOK_DLL
#include "dllhook.h"
#endif

//////////////////////////////////////////////////////////////////////////////////

#endif

新建dllhook.cpp鍵入如下程式碼

#include "dllhook.h"
#include <assert.h>
#include <windows.h>

HHOOK g_hook=NULL;

#pragma data_seg("my_data")
HWND g_hwnd=NULL;
#pragma data_seg()
#pragma comment (linker,"/section:my_data,RWS")

BOOL APIENTRY DllMain(HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		{
			OutputDebugString(TEXT("載入dll"));
		}
		break;
	case DLL_THREAD_ATTACH:
		{
			OutputDebugString(TEXT("新建執行緒"));
		}
		break;
	case DLL_THREAD_DETACH:
		{
			OutputDebugString(TEXT("執行緒退出"));
		}
		break;
	case DLL_PROCESS_DETACH:
		{
			OutputDebugString(TEXT("釋放dll"));
			if (g_hook)
				UnhookWindowsHookEx(g_hook);
		}
		break;
	}
	return TRUE;
}

LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam)
{
	if (VK_F2==wParam && (lParam>>31 &1)==0)
	{
		MessageBox(NULL,TEXT("測試"),NULL,MB_OK);
		return true;
	}
	else if (VK_F4==wParam && (lParam>>31 &1)==0)
	{
		SendMessage(g_hwnd,WM_CLOSE,0,0);
		if (g_hook)
			UnhookWindowsHookEx(g_hook);
		return true;
	}
	else
		return CallNextHookEx(g_hook,code,wParam,lParam);

	assert(false);
	return false;
}

bool SetKeyBoardHook(HWND hwnd)
{
	g_hwnd=hwnd;
	g_hook=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle(TEXT("dllhook.dll")),NULL);
	if (g_hook==NULL)
	{
		assert(false);
		MessageBox(NULL,TEXT("設定HOOK失敗"),NULL,MB_OK);
		return false;
	}
	return true;
}

exe部分檔案一個空的win32專案取名1,設定在靜態庫中使用MFC

1.h鍵入如下程式碼

#ifndef MFCTEST_HEAD
#define MFCTEST_HEAD
#pragma once

#include <afxwin.h>
#include <afxframewndex.h>

#define IDC_START   1012            //按鈕定義

class CMyApp:public CWinApp
{
public:
	//建構函式
	CMyApp();
	//解構函式
	virtual ~CMyApp();

	//過載函式
public:
	//初始函式
	virtual BOOL InitInstance();
};



class CMyWindow : public CFrameWndEx
{
public:
	//建構函式
	CMyWindow();
	//解構函式
	virtual ~CMyWindow();

	//虛擬函式
public:
	//命令響應訊息
	virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);


	//訊息對映
public:
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	DECLARE_MESSAGE_MAP()

public:
	CButton       m_button;       //按鈕

};



#endif

1.cpp鍵入如下程式碼

#include "1.h"
#include "..\\..\\dllhook\dllhook\dllhook.h"
#pragma comment (lib,"dllhook.lib")

CMyApp myapp;

//建構函式
CMyApp::CMyApp()
{

}

//解構函式
CMyApp::~CMyApp()
{

}

//初始函式
BOOL CMyApp::InitInstance()
{
	m_pMainWnd = new CMyWindow();
	m_pMainWnd->ShowWindow(SW_SHOW);
	m_pMainWnd->UpdateWindow();
	return TRUE;
}



//{{AFX_MSG_MAP(CFrameWndEx)
BEGIN_MESSAGE_MAP(CMyWindow, CFrameWndEx)
	ON_WM_CREATE()
END_MESSAGE_MAP()


//建構函式
CMyWindow::CMyWindow()
{
	Create(NULL, TEXT("My Window"));
	RECT rect={0,0,50,30};
	m_button.Create(TEXT("按鈕"),WS_CHILD|WS_VISIBLE,rect,this,IDC_START);
}
//解構函式
CMyWindow::~CMyWindow()
{
}

//命令響應訊息
BOOL CMyWindow::OnCommand( WPARAM wParam, LPARAM lParam )
{
	int wmId=LOWORD(wParam);
	switch (wmId)
	{
	case IDC_START:
		{
			MessageBox(TEXT("測試一下哈"),TEXT("提示"),MB_OK);
			return true;
		}
		break;
	default:
		return true;
	}

	return __super::OnCommand(wParam,lParam);

}

//建立事件
int CMyWindow::OnCreate( LPCREATESTRUCT lpCreateStruct )
{
	__super::OnCreate(lpCreateStruct);
	SetKeyBoardHook(m_hWnd);
	return true;
}

相關推薦

SetWindowsHookEx設定全域性鍵盤鉤子

vs2010新建一個空的win32專案取名dllhook 新建dllhook.def鍵入如下程式碼 LIBRARY dllhook EXPORTS SetKeyBoardHook @123 新建dllhook.h鍵入如下程式碼 #ifndef DLLHOOK_H

使用SetWindowsHookEx(WH_KEYBOARD,...)製作全域性鍵盤鉤子

學習《Windows程式設計》時,照著例子作了一個全域性的鍵盤鉤子,可以截獲到使用者的按鍵。 先是動態庫部分: /////////////////////////////////////////// // KeyHookLib.h檔案 // 定義函式修飾巨集,方便

c# 全域性鍵盤鉤子(無窗體)

using System;using System.Collections.Generic;using System.Windows.Forms;using System.ComponentModel;using System.Data;using System.Drawing;using Syst

windows之全域性鍵盤鉤子以及鍵盤事件模擬觸發

全域性鍵盤鉤子 #include <Windows.h> #include "WinUser.h" #include <iostream> using namespace std; // variable to store the

HOOK使用:全域性鍵盤鉤子

// CatchKey.cpp : Defines the entry point for the DLL application. // #define _WIN32_WINNT 0x0500 //設定系統版本,可以使用底層鍵盤鉤子 #define WM

如何讓你的程式避開全域性鍵盤鉤子的監視

      一直以來有個疑問,就是如果別人在你的電腦上安裝了鍵盤鉤子來監視你的鍵盤按鍵動作,我的程式怎麼才能避開這些全域性鍵盤鉤子(system-wide hook)的監視.正好最近一段時間因為工作關係在研究鉤子,順便研究了一下這個問題,今天算是找到了一個解決辦法.解決辦法:

SetWindowsHookEx在當前程序設定鍵盤鉤子

vs2010新建一個空的win32工程,工程設定在靜態庫中使用mfc 1.h//鍵入如下程式碼 #ifndef MFCTEST_HEAD #define MFCTEST_HEAD #pragma o

C#鍵盤鉤子之區域性鉤子全域性鉤子

最近碰巧要使用鍵盤鉤子,於是在網上搜索了一番,發現大多數部落格的文章都是雷同的,根本就沒有講清楚全域性鉤子和區域性鉤子的區別,於是特開一貼,講全域性鉤子和區域性鉤子捋一捋。也供後面的人學習。 因為大部分應用都應該採用區域性鉤子,所以我這兒使用的是區域性鉤子,而全域性鉤子的例子網上到處都

全局鍵盤鉤子

call ++ http void export eof one rtu 資料 記得幾年前學習windows開發的時候,為了一個鍵盤鉤子在網上找了無數的資料也沒幾個能用的。 最近又需要用到全局鍵盤鉤子記錄鍵盤消息,發現一篇不錯的文章。 http://blog.csdn.ne

在WPF中快速實現鍵盤鉤子

nag Dll調用 bin != 攔截 class key and view 原文:在WPF中快速實現鍵盤鉤子大部分的時候,當我們需要鍵盤事件的時候,可以通過在主窗口註冊KeyBinding來實現,不過,有的時候我們需要的是全局鍵盤事件,想在任何一個地方都能使用,最開始的時

WPF 利用鍵盤鉤子來捕獲鍵盤,做一些不為人知的事情...完整實例

程序猿 通過 不知道 tro color launcher 聲明 leg win 原文:WPF 利用鍵盤鉤子來捕獲鍵盤,做一些不為人知的事情...完整實例鍵盤鉤子是一種可以監控鍵盤操作的指令。 看到這句話是不是覺得其實鍵盤鉤子可以做很多事情. 場景 當你的程序需

Android 設定鍵盤右下角鍵盤樣式和監聽右下角點選回撥

文章目錄 設定軟鍵盤右下角按鍵顯示樣式 監聽右下角點選回撥 設定軟鍵盤右下角按鍵顯示樣式 在EditText中使用android:imeOptions設定右下角顯示樣式(需要搭配 android

jmeter設定全域性變數與正則表示式提取器

介面測試中,很多介面都要帶上登入後的token才能正常傳送請求,這裡記錄一下登入獲取token設定為全域性變數供其他介面使用 登入後返回資訊資訊中會有一個token值,新增後置處理器中的正則表示式提取token,然後用後置處理器中的BeanShell PostProcessor設定token為全域性變數

第17講 struts2設定全域性

全域性變數是一個包內所有action都可能用到的,首先檢查自己的<action>標籤內是否有匹配的result字串,如果沒有去去全域性變數中找 1在HeadFirstStruts2chapter02_07中,新建HelloAction,error屬性,設定邏輯程式碼。返回值"error"

【微信小程式學習之路】----使用globalData函式設定全域性變數

我們在app.js中設定需要的全域性變數的引數,比如公司名稱等 //app.js App({ globalData: { title: 'tomatocc' } }) 然後我們就可以在某個頁面的js檔案中(比如index.js)的data數組裡面去直

鍵盤鉤子 HOOK

請不多說,直接上程式碼。 主要問題是自己解決了  Ctrl + Alt + A ,這樣的三個鍵組合的情況。 using System; using System.Collections.Generic; using System.Text; using System.Ru

CSS3_拖曳原理_設定全域性點選捕獲_九宮格碰撞檢測_自定義滾動條

拖曳原理: 元素的初始位置 + 滑鼠距離差 = 元素最終位置   使元素可以拖動 function dragElement(obj){ obj.onmousedown = function(e){ e =

node.js 設定全域性快取和下載路徑

一、修改配置 方式1、 在nodejs的安裝目錄中找到node_modules\npm\.npmrc檔案 修改如下即可: prefix = D:\AppData\NodeJs\node_global_modules cache = D:\AppData\NodeJs\node_c

xcode設定全域性巨集,修改NSLog列印格式

問題丟擲:   1、系統原始的NSLog列印輸出格式,包含很多不必要的資訊,例如下圖,我們能否修改NSLog的輸出格式呢?       2、如果可以修改NSLog,如何使之在整個工程全域性生效?   問題解決:

二叉搜尋樹與雙向連結串列的優化,設定全域性變數指向最後一次遍歷的從而連線,省略了迴圈找到最後的節點進行連線

package niuke; public class SearchTreenode3 {     TreeNode lastNode = null;       public static void main(String[] arg