Find all our projects in development below.
All source code is GNU General Public License (GPL)
Browsing rcmanhk.cpp (5.06 KB)
#ifdef _MSC_VER
#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "gdi32.lib")
#pragma comment(lib, "shell32.lib")
#endif
#include "rcmanhk.h"
#pragma data_seg(".shared")
HWND hwndApp=NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.shared,RWS")
HINSTANCE g_hThisDll=NULL;
LRESULT NotifyApp(DWORD rmkey);
int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
g_hThisDll = hInstance;
g_hShellHook = NULL;
break;
case DLL_PROCESS_DETACH:
{
if(pfnWndProc)
{
if(IsWindowUnicode(g_hwndToMineWindow))
{
SetWindowLongW(g_hwndToMineWindow, GWL_WNDPROC,
(LPARAM)(WNDPROC)pfnWndProc);
}
else
{
SetWindowLongA(g_hwndToMineWindow, GWL_WNDPROC,
(LPARAM)(WNDPROC)pfnWndProc);
}
pfnWndProc = NULL;
}
}
}
return TRUE;
}
BOOL APIENTRY RcManHook_Init(HWND hwndIn)
{
if (g_hShellHook == NULL)
{
pfnWndProc = NULL;
g_hShellHook = SetWindowsHookEx(WH_CBT, RcManHook_CBTProc, g_hThisDll, 0);
if (g_hShellHook == NULL)
{
return false;
}
else
{
hwndApp = hwndIn;
return true;
}
}
else
{
return false;
}
}
void APIENTRY RcManHook_UnInit()
{
if(g_hShellHook != NULL)
{
UnhookWindowsHookEx(g_hShellHook);
g_hShellHook = NULL;
}
}
LRESULT CALLBACK RcManHook_CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
TCHAR szClass[MAX_PATH] = {0};
if(nCode < 0)
return CallNextHookEx(g_hShellHook, nCode, wParam, lParam);
if(nCode == HCBT_CREATEWND)
{
HWND hwndToNewWindow = reinterpret_cast<HWND>(wParam);
GetClassName(hwndToNewWindow, szClass, MAX_PATH);
if(!lstrcmpi(szClass, __TEXT("RcManagerClass")))
{
RcManHook_UnInit();
g_hwndToMineWindow = hwndToNewWindow;
if(IsWindowUnicode(g_hwndToMineWindow))
{
pfnWndProc = (WNDPROC)SetWindowLongW(g_hwndToMineWindow, GWL_WNDPROC,
(LPARAM)(WNDPROC)RCMAN_SubClassWndProc);
}
else
{
pfnWndProc = (WNDPROC)SetWindowLongA(g_hwndToMineWindow, GWL_WNDPROC,
(LPARAM)(WNDPROC)RCMAN_SubClassWndProc);
}
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
LRESULT WINAPI RCMAN_SubClassWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lResult = 0;
if (uMsg == 0x1F3A) {
switch(lParam)
{
case 0x100FE: // Zero
lResult = NotifyApp(RMKEY_ZERO);
break;
case 0x1002E: // One
lResult = NotifyApp(RMKEY_ONE);
break;
case 0x1000E: // Two
lResult = NotifyApp(RMKEY_TWO);
break;
case 0x100F6: // Three
lResult = NotifyApp(RMKEY_THREE);
break;
case 0x100AE: // Four
lResult = NotifyApp(RMKEY_FOUR);
break;
case 0x100DE: // Five
lResult = NotifyApp(RMKEY_FIVE);
break;
case 0x100E1: // Six
lResult = NotifyApp(RMKEY_SIX);
break;
case 0x1006E: // Seven
lResult = NotifyApp(RMKEY_SEVEN);
break;
case 0x1003E: // Eight
lResult = NotifyApp(RMKEY_EIGHT);
break;
case 0x10011: // Nine
lResult = NotifyApp(RMKEY_NINE);
break;
case 0x1005E: // Stop/Eject
lResult = NotifyApp(RMKEY_STOP);
break;
case 0x10061: // Play/Pause
lResult = NotifyApp(RMKEY_PLAY);
break;
case 0x10041: // Slow
lResult = NotifyApp(RMKEY_SLOW);
break;
case 0x10001: // Previous
lResult = NotifyApp(RMKEY_PREVIOUS);
break;
case 0x100A1: // Next
lResult = NotifyApp(RMKEY_NEXT);
break;
case 0x10081: // Step
lResult = NotifyApp(RMKEY_STEP);
break;
case 0x10089: // Mute
lResult = NotifyApp(RMKEY_MUTE);
break;
case 0x39: // Vol Down
lResult = NotifyApp(RMKEY_VOLDN);
break;
case 0xB9: // Vol Up
lResult = NotifyApp(RMKEY_VOLUP);
break;
case 0x100CE: // EAX
lResult = NotifyApp(RMKEY_EAX);
break;
case 0x100BE: // Options
lResult = NotifyApp(RMKEY_OPTIONS);
break;
case 0x10091: // Display
lResult = NotifyApp(RMKEY_DISPLAY);
break;
case 0x1008E: // Return
lResult = NotifyApp(RMKEY_RETURN);
break;
case 0x100EE: // Start
lResult = NotifyApp(RMKEY_START);
break;
case 0x100C1: // Close
lResult = NotifyApp(RMKEY_CLOSE);
break;
case 0x1E: // Left
lResult = NotifyApp(RMKEY_DPAD_LEFT);
break;
case 0x51: // Right
lResult = NotifyApp(RMKEY_DPAD_RIGHT);
break;
case 0x21: // Up
lResult = NotifyApp(RMKEY_DPAD_UP);
break;
case 0x4E: // Down
lResult = NotifyApp(RMKEY_DPAD_DOWN);
break;
case 0x1007E: // Select
lResult = NotifyApp(RMKEY_SELECT);
break;
default:
break;
}
}
// Call previous window procedure
if(IsWindowUnicode(hwnd))
{
lResult = CallWindowProcW((WNDPROC) (DWORD)pfnWndProc, hwnd, uMsg, wParam, lParam);
}
else if (lResult == 0xFFFFFFFF)
{
lResult = 0;
}
else
{
lResult = CallWindowProcA((WNDPROC) (DWORD)pfnWndProc, hwnd, uMsg, wParam, lParam);
}
return lResult;
}
LRESULT NotifyApp(DWORD rmkey)
{
return SendMessage(hwndApp, WM_RMKEYPRESS, NULL, rmkey);
}