Projects

Find all our projects in development below.
All source code is GNU General Public License (GPL)

RcManagerClass Hook DLL

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);
}

Download rcmanhk.cpp

Back to file list


Back to project page