blob: 4b74fdfa8c9cdf53dd0f982b22a21b7ecf78042b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 IBM Corporation and Others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Hisashi MIYASHITA - initial API and implementation
*******************************************************************************/
#include <windows.h>
#include <jni.h>
#include "KeyHook.h"
static HHOOK hhook;
static HWND hmainWnd;
LRESULT CALLBACK
hookedWndProcRet(int code, WPARAM wParam, LPARAM lParam)
{
if (code == HC_ACTION) {
CWPRETSTRUCT* ret = (CWPRETSTRUCT*) lParam;
if (ret->hwnd == hmainWnd) {
#ifdef DEBUG
fprintf(stderr, "Window Hooked:%d, %d\n", wParam, ret->message);
fflush(stderr);
#endif
switch (ret->message) {
case WM_ACTIVATE:
if (LOWORD(ret->wParam) == WA_INACTIVE) {
stopFilter();
} else {
startFilter();
}
break;
case WM_ENTERMENULOOP:
stopFilter();
break;
case WM_EXITMENULOOP:
startFilter();
break;
}
}
}
return CallNextHookEx(hhook, code, wParam, lParam);
}
void
initialize_WindowHook(HWND hookhwnd)
{
if (!hhook) {
HINSTANCE hInst;
DWORD threadId = GetCurrentThreadId();
hInst = (HINSTANCE) GetModuleHandle(0);
hmainWnd = hookhwnd;
hhook = SetWindowsHookEx(WH_CALLWNDPROCRET, hookedWndProcRet, NULL, threadId);
}
}