2
私はSetWinEventHook
フックを使用して編集コントロールの選択を検出しています。イベントフックコールバック関数では、カスタムデータを指定する方法はありますか?私の場合、カスタムデータはVKeyboard
インスタンスになります。SetWinEventHook with custom data
私が達成しようとしていることのより良い説明については、コードをご覧ください。
class VKeyboard
{
public:
static void CALLBACK winEventProc(HWINEVENTHOOK hWinEventHook, DWORD event, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime)
{
// Somehow access VKeyboard instance?
VKeyboard* keyboard = ??;
IAccessible* pAcc = NULL;
VARIANT varChild;
HRESULT hr = AccessibleObjectFromEvent(hwnd, idObject, idChild, &pAcc, &varChild);
if ((hr == S_OK) && (pAcc != NULL))
{
VARIANT varRole;
hr = pAcc->get_accRole(varChild, &varRole);
// if user selects a edit control: show window
if ((hr == S_OK) && (varRole.vt == VT_I4) && (varRole.lVal == ROLE_SYSTEM_TEXT))
ShowWindow(keyboard->mainHwnd, SW_SHOW);
else ShowWindow(keyboard->mainHwnd, SW_HIDE);
pAcc->Release();
}
}
VKeyboard()
{
SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_FOCUS, NULL, (WINEVENTPROC)&winEventProc, 0, 0, WINEVENT_SKIPOWNPROCESS);
SetWindowLongPtr (mainHwnd, GWLP_USERDATA, (LONG_PTR)this);
}
HWND mainHwnd;
}