Hej igen,
jag har suttit nån timme och försökt fått till det med det fungerar inte riktigt.
Har tyvärr inte tid att sitta mer, men om någon annan vill prova så kommer lite kod här:
För att starta/avsluta en process är det bara att använda CreateProcess och TerminateProcess, till exempel:
#include <windows.h>
HANDLE StartProcess(const char *pPath, char *pArgs = 0)
{
STARTUPINFOA startupInfo;
PROCESS_INFORMATION procInfo;
memset(&startupInfo, 0, sizeof(STARTUPINFOA));
startupInfo.cb = sizeof(STARTUPINFOA);
CreateProcessA(pPath, pArgs, 0, 0, false, 0, 0, 0, &startupInfo, &procInfo);
return procInfo.hProcess;
}
void EndProcess(HANDLE hProc)
{
TerminateProcess(hProc, 0);
}
Sen den svåra biten. Att göra så att en knapptryckning fångas av programmet. Enkelt tänkte jag, bara att installera en system-wide keyhook (i en extern DLL då):
DllMain:
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
hInst = (HINSTANCE)hModule;
break;
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Och dom exporterade funktionerna för att installera/avinstallera keyhooken:
// Exports
__declspec(dllexport) HHOOK InstallKeyHook();
__declspec(dllexport) BOOL UninstallKeyHook();
HHOOK InstallKeyHook()
{
// Setup a message hook
if (g_hHook== NULL)
g_hHook= SetWindowsHookEx(WH_KEYBOARD, KeyHookProc, hGInst, 0);
return g_hHook;
}
BOOL UninstallKeyHook()
{
// If gHKey is valid, unhook it
BOOL result = FALSE;
if (g_hHook!= NULL)
{
result = UnhookWindowsHookEx(g_hHook);
g_hHook= NULL;
}
return result;
}
LRESULT CALLBACK KeyHookProc(int code, WPARAM wParam, LPARAM lParam)
{
if (code >= 0)
{
// Här är problemet. Kollar man på MSDN så ser man att wParam
// ska innehålla virtual key (dvs wParam == 'H' för ett event
// med h-tangenten). Vidare ska det i lParam finnas en flagga
// för att se om tangenten släpptes upp eller trycktes ner
// men verkar inte riktigt stämma :(.
//
// Provade att använda GetAsyncKeyState() eller
// GetKeyboardState() för att kolla om det var tangent upp/ner
// men råkar då ut för något mysko problem som liknar något
// typ av synkroniseringsproblem. Här tar mina kunskaper om DLL
// i windows slut.
}
// Pass hook information on to the next hook
return CallNextHookEx(gHKey, code, wParam, lParam);
}
Så om någon vill prova på (eller vet vad det är för fel i KeyHookProc) så gör gärna ett eget försök. Koden ovan kanske kan vara till hjälp i alla fall.