Ich verwende SetWinEventHook
Hook, um die Auswahl von Bearbeiten Steuerelemente zu erkennen. Gibt es in der Ereignis-Hook-Callback-Funktion eine Möglichkeit, benutzerdefinierte Daten anzugeben? In meinem Fall wären die benutzerdefinierten Daten die VKeyboard
Instanz.SetWinEventHook mit benutzerdefinierten Daten
Bitte beachten Sie den Code für eine bessere Beschreibung dessen, was ich erreichen möchte.
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;
}