2016-05-08 6 views
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; 
} 

答えて

1

あなたのフックコールバックがOut of Context hookとして実装されているので、それは常に他のプロセスのイベントをフックする場合でも、SetWinEventHook()を呼び出したスレッドのコンテキストで呼ばれています。したがって、VKeyboardオブジェクトポインタを格納するには、Thread Local Storage、または単にグローバル変数を使用することができます。ただVKeyboardのインスタンスが1つだけ必要な場合は、それが提供されます。