2016-07-15 14 views
0

グローバルなマウスクリックを処理するロジックを実装しています。私はLowLevelMouseProcからデータを取得する必要がある瞬間に立ち往生しました。現在、MyClassのインスタンスを作成し、LowLevelMouseProcからアクセスすることができる時点でグローバル変数を設定していますが、それは正しいアプローチではないと思います。クラスインスタンスをLowLevelMouseProcに渡すにはどうすればいいですか?

設定フック:

g_myClass = this; 
SetWindowsHookEx(WH_MOUSE_LL, MyClass::MouseHookProc, LoadLibraryA("user32.dll"), 0); 

LowLevelMouseProc:

LRESULT CALLBACK MyClass::MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) { 
    MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lParam; 
    g_myClass.onClick(wParam, pMouseStruct->pt.x, pMouseStruct->pt.y); //isn't good 
} 

答えて

2

低レベルのマウスフックは、インスタンスのポインタを取得することが可能な仕組みを提供しています。多くの場合、グローバル変数を使用するのが最良の方法です。

プログラムをそのように動作させることができない場合は、サンクを使用する必要があります。その技術は多くの場所で議論されており、ウェブ検索でより詳細な情報が提供されます。たとえば、私の部分の大雑把な検索では、次のようになりました。http://zabkat.com/blog/hook-callback-thunk-x64.htm

+0

私はグローバル変数を使うことができると思っています。ありがとうございました。 – Vladimirs

+0

低レベルのマウスフックの代わりに[RAW Input API](https://msdn.microsoft.com/en-us/library/windows/desktop/ms645536.aspx)を使用することを検討してください。 'SetWindowsLongPtr()'、 'SetProp()'、 'SetWindowSubclass()'を使ってクラスオブジェクトポインタを 'WM_INPUT'メッセージを受け取るHWNDに関連付けることができます。 –

関連する問題