2016-05-08 9 views
2

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; 
} 

Antwort

1

Da Ihr Hook-Rückruf als Out of Context hook implementiert wird, wird es immer im Kontext des Threads aufgerufen, die SetWinEventHook() nennt, auch wenn Ereignisse von anderen Prozessen Einhaken. So können Sie Thread Local Storage oder auch nur eine globale Variable verwenden, um Ihren Objektzeiger VKeyboard zu speichern. Vorausgesetzt, Sie benötigen nur eine Instanz von VKeyboard.

Verwandte Themen