My requirement is a program which will :
1. Set up a system wide keyboard hook.
2. Launch Internet Explorer in a new process (and have the hook disable some keyboard navigation hotkeys).
3. Wait for IE to finish and remove keyboard hook.
At present, if I :
1. Set up the keyboard hook (using code below).
2. "Manually" start IE from desktop
Then the keyboard hook is in place, all is well.
The problem is that if I programmatically launch ie in a new process from the same program which set the keyboard hook, the hook does not work.
The keyboard hook code is in a dll, which includes the following code :
#pragma comment(linker, "-section:.shared,rws")
#pragma data_seg(".shared")
HHOOK kbHook = NULL; // Keyboard hook
#pragma data_seg()
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PKBDLLHOOKSTRUCT p;
if (nCode == HC_ACTION)
{
p = (PKBDLLHOOKSTRUCT) lParam;
if (
// Ctrl-A
((p->vkCode == 'A') && ((GetAsyncKeyState(VK_CONT
ROL) & 0x8000) != 0)))
return 1;
}
return CallNextHookEx(kbHook, nCode, wParam, lParam);
}
int DLL_EXP_IMP WINAPI Set_Keyboard_Hook(BOOL bEnableDisable)
{
if (!bEnableDisable) {
if (!kbHook) {
kbHook = SetWindowsHookEx(WH_KEYBOA
RD_LL, LowLevelKeyboardProc, hInst, 0);
if (!kbHook)
return 0;
}
} else {
UnhookWindowsHookEx(kbHook
);
kbHook = NULL;
}
return 1;
}
The calling code calls
Set_Keyboard_Hook(flag);
to install or uninstall the hook. I am using
StartProcess("default", "C:\\Program Files\\Internet Explorer\\iexplore.exe");
to launch ie, where the start process code is :
BOOL StartProcess(char *szDesktopName, char *szPath)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
// Zero these structs
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.lpTitle = szDesktopName;
si.lpDesktop = szDesktopName;
ZeroMemory(&pi, sizeof(pi));
// Start the child process
if (!CreateProcess(NULL, szPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
return FALSE;
}
// Wait until process exits
WaitForSingleObject(pi.hPr
ocess, INFINITE);
// Close process and thread handles
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return TRUE;
}
Is what I want to do possible, and if so how do I do it. Thanks in advance.
Start Free Trial