📄 hook.cpp
字号:
// Hook.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include "Hook.h"
#include "winuser.h"
#include <tlhelp32.h>
#define DllExport _declspec(dllexport)
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#pragma data_seg(".SHARDAT")
static HHOOK hkb = NULL;
#pragma data_seg()
HINSTANCE hins;
static POINT CurPosPre={0,0};
static BOOL rbtnDown = FALSE;
static BOOL rbtnMove = FALSE;
static BOOL mbtnDown = FALSE;
static BOOL mbtnMove = FALSE;
//
// 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.
//
/////////////////////////////////////////////////////////////////////////////
// CHookApp
BEGIN_MESSAGE_MAP(CHookApp, CWinApp)
//{{AFX_MSG_MAP(CHookApp)
// 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()
/////////////////////////////////////////////////////////////////////////////
// CHookApp construction
CHookApp::CHookApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CHookApp object
CHookApp theApp;
BOOL CheckProcess(char *szProcessNameCurrent)
{
DWORD pid;
HANDLE hProcess;
char szProcessName[256];
HWND hWnd = GetForegroundWindow();
GetWindowThreadProcessId(hWnd, &pid);
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
if (NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;
typedef DWORD (CALLBACK * GetModuleBaseName)(
HANDLE hProcess, // handle to the process
HMODULE hModule, // handle to module to find filename for
LPTSTR lpFilename, // pointer to buffer to receive module path
DWORD nSize // size of buffer, in characters
);
typedef BOOL (CALLBACK *EnumProcessModules)(
HANDLE hProcess, // handle to the process
HMODULE * lphModule, // array to receive the module handles
DWORD cb, // size of the array
LPDWORD lpcbNeeded // receives the number of bytes returned
);//定义回调函数的地址
HINSTANCE hPsDll = LoadLibrary("PSAPI.DLL");
GetModuleBaseName pGetModuleBaseName =
(GetModuleBaseName)GetProcAddress(hPsDll, "GetModuleBaseNameA");
EnumProcessModules pEnumProcessModules =
(EnumProcessModules)GetProcAddress(hPsDll, "EnumProcessModules");
if ( pEnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
{
if(pGetModuleBaseName( hProcess, hMod, szProcessName,
sizeof(szProcessName)/sizeof(TCHAR)))
{
_strlwr(szProcessName);
if(strstr(szProcessName, szProcessNameCurrent))
{
return TRUE;
}
}
}
}
return FALSE;
}
LRESULT DllExport CALLBACK LowLevelMouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
CString str;
if(nCode == HC_ACTION)
{
PMSLLHOOKSTRUCT pMSLLHook = (PMSLLHOOKSTRUCT)lParam;
if(wParam == WM_MOUSEMOVE)
{
if(!CheckProcess("powerpcb"))
{
return CallNextHookEx(hkb, nCode, wParam, lParam );
}
if(rbtnDown)
{
POINT pt;
HWND hWnd;
GetCursorPos(&pt);
hWnd = WindowFromPoint(pt);
if(abs(pMSLLHook->pt.x - CurPosPre.x)>32)
{
PostMessage(hWnd, WM_KEYDOWN, VK_SHIFT, 0);
PostMessage(hWnd,
WM_MOUSEWHEEL,
((pMSLLHook->pt.x - CurPosPre.x)<<16|MK_SHIFT),
((pMSLLHook->pt.y << 16) + pMSLLHook->pt.x));
PostMessage(hWnd, WM_KEYUP, VK_SHIFT, 0);
CurPosPre.x = pMSLLHook->pt.x;
rbtnMove = TRUE;
}
if(abs(pMSLLHook->pt.y - CurPosPre.y)>32)
{
PostMessage(hWnd, WM_KEYDOWN, VK_MENU, 0);
PostMessage(hWnd,
WM_MOUSEWHEEL,
((pMSLLHook->pt.y - CurPosPre.y)<<16),
((pMSLLHook->pt.y << 16) + pMSLLHook->pt.x));
PostMessage(hWnd, WM_KEYUP, VK_MENU, 0);
CurPosPre.y = pMSLLHook->pt.y;
rbtnMove = TRUE;
}
return CallNextHookEx(hkb, nCode, wParam, lParam );
}
else if(mbtnDown)
{
mbtnMove = TRUE;
}
return CallNextHookEx(hkb, nCode, wParam, lParam );
}
{
HWND hWnd = GetForegroundWindow();
if(wParam == WM_MOUSEWHEEL)
{
TRACE("WHELL Action !\n");
str.Format("MouseData is 0x%x", (short)HIWORD(pMSLLHook->mouseData));
TRACE(str);
if((!CheckProcess("client99se"))
&& (!CheckProcess("dxp"))
&& (!CheckProcess("powerpcb"))
&& (!CheckProcess("capture")))
{
return CallNextHookEx(hkb, nCode, wParam, lParam );
}
if(CheckProcess("capture"))
{
if((short)HIWORD(pMSLLHook->mouseData) > 0)
{
PostMessage(hWnd, WM_KEYDOWN, 'I', 0);
PostMessage(hWnd, WM_KEYUP, 'I', 0);
return TRUE;
}
else
{
PostMessage(hWnd, WM_KEYDOWN, 'O', 0);
PostMessage(hWnd, WM_KEYUP, 'O', 0);
return TRUE;
}
}
else
{
if((short)HIWORD(pMSLLHook->mouseData) > 0)
{
PostMessage(hWnd, WM_KEYDOWN, 0x21, 0);
}
else
{
PostMessage(hWnd, WM_KEYDOWN, 0x22, 0);
}
}
}
else if(wParam == WM_MBUTTONDOWN)
{
if(CheckProcess("powerpcb"))
{
mbtnMove = FALSE;
mbtnDown = TRUE;
}
if((!CheckProcess("client99se")) && (!CheckProcess("dxp")))
{
return CallNextHookEx(hkb, nCode, wParam, lParam );
}
PostMessage(hWnd, WM_KEYDOWN, 106, 0);
PostMessage(hWnd, WM_KEYUP, 106, 0);
PostMessage(hWnd, WM_KEYDOWN, VK_END, 0);
}
else if(wParam == WM_MBUTTONUP)
{
if(CheckProcess("powerpcb"))
{
mbtnDown = FALSE;
if(mbtnMove)
{
return CallNextHookEx(hkb, nCode, wParam, lParam );
}
PostMessage(hWnd, WM_KEYDOWN, VK_F4, 0);
PostMessage(hWnd, WM_KEYUP, VK_F4, 0);
}
}
else if(wParam == WM_RBUTTONDOWN)
{
if(CheckProcess("powerpcb"))
{
rbtnDown = TRUE;
CurPosPre = pMSLLHook->pt;
return TRUE;
}
if((!CheckProcess("client99se")) && (!CheckProcess("dxp")))
{
return CallNextHookEx(hkb, nCode, wParam, lParam );
}
if(GetAsyncKeyState(VK_LBUTTON) & 0x8000)
{
PostMessage(hWnd, WM_KEYDOWN, ' ', 0);
return TRUE;
}
}
else if(wParam == WM_RBUTTONUP)
{
rbtnDown = FALSE;
if(CheckProcess("powerpcb"))
{
if(rbtnMove)
{
rbtnMove = FALSE;
return CallNextHookEx(hkb, nCode, wParam, lParam );
}
POINT p;
GetCursorPos(&p);
hWnd = WindowFromPoint(p);
ScreenToClient(hWnd, &p);
lParam = MAKELPARAM(p.x, p.y);
PostMessage(hWnd, WM_RBUTTONDOWN, MK_LBUTTON, lParam);
return CallNextHookEx(hkb, nCode, wParam, lParam );
}
if((!CheckProcess("client99se")) && (!CheckProcess("dxp")))
{
return CallNextHookEx(hkb, nCode, wParam, lParam );
}
if(GetAsyncKeyState(VK_LBUTTON))
{
// PostMessage(hWnd, WM_KEYDOWN, ' ', 0);
return TRUE;
}
}
}
}
return CallNextHookEx(hkb, nCode, wParam, lParam );
}
BOOL DllExport installhook()
{
hkb = SetWindowsHookEx(14,(HOOKPROC)LowLevelMouseProc,hins,0);
return TRUE;
}
BOOL DllExport UnHook()
{
BOOL unhooked = UnhookWindowsHookEx(hkb);
return unhooked;
}
BOOL CHookApp::InitInstance()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
hins=AfxGetInstanceHandle();
return CWinApp::InitInstance();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -