2

この関数「EnumWindows(EnumWindowsProc、NULL);」を使用したい。EnumWindowsProcはコールバック関数です。

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);

このコールバックでは、クラスのメンバー関数を使用します。

例えば:

Class MyClass
{
    BOOL CALLBACK My_EnumWindowsProc(HWND hwnd, LPARAM lParam);
    void          test();
};

だから私は呼び出されたコールバックを私の関数にバインドしたいです!!!

私はこれを試してみます:

void MyClass::test()
{
    EnumWindowsProc ptrFunc = mem_fun(&MyClass::My_EnumWindowsProc);
    EnumWindows(ptrFunc, NULL);
}

それは機能しません、「mem_fun」は1つの引数しか取ることができません!それを行うことは可能ですか?そうでなければあなたは別の解決策を知っていますか?(たぶん、Boost :: bindで解決策が可能になるでしょう)

4

5 に答える 5

3

次のようなアダプタを作成する必要があります。

#include <windows.h>
#include <iostream>
#include <string>
using namespace std;

class MyCallback
{
public:
    MyCallback() : count_(0) {};
    static BOOL CALLBACK CallbackAdapter(HWND, LPARAM);
    BOOL Callback(HWND);
    unsigned count_;
};

BOOL MyCallback::Callback(HWND wnd)
{
    char title[1025] = {};
    GetWindowText(wnd, title, sizeof(title)-1);
    cout << wnd << "= '" << title << "'" << endl;
    ++count_;
    return TRUE;
}

BOOL MyCallback::CallbackAdapter(HWND wnd, LPARAM lp)
{
    MyCallback* that = reinterpret_cast<MyCallback*>(lp);
    return that->Callback(wnd);
}

int main()
{
    MyCallback cb;
    EnumWindows(&MyCallback::CallbackAdapter, reinterpret_cast<LPARAM>(&cb));
    cout << "Windows Found: " << cb.count_;
    return 0;
}
于 2010-03-04T18:46:29.617 に答える
0

残念ながら、EnumWindowsProcは、非表示の「this」ポインターを追加してコールバックプロトタイプと互換性がなくなることを避けるために、静的である必要があります。私は過去に、この呼び出しでウィンドウを作成した後にこのポインターを保存することでこれを処理しました。

SetWindowLong(handle,GWL_USERDATA,(DWORD)this);

次に、EnumWindowsProc(静的)内で次のようにします。

MyClass* thisClass = (MyClass*)GetWindowLong(hwnd,GWL_USERDATA);

これでオブジェクトポインタができました。これを使用して、非静的関数を呼び出すことができます。

thisClass->ActualEnumWindowsProc(hwnd,lParam);
于 2010-03-04T19:12:56.270 に答える
0

私の最初の答えを気にしないでください:あなたがする必要があるのは基本的にこれです:

struct InfoINeed {
 MyClass * mThis;
 ...
};

BOOL MyCallback(HWND hwnd, LPARAM lParam) {
 InfoINeed* info = (InfoINeed*)hwnd;
 // do your stuff, i.e. info->mThis->MyImplementationForCallback(lParam)
 // note that you won't need to pass hwnd further, it's a pointer to your own context
}

void MyClass::test()
{
    InfoINeed Info = {this, ...};
    EnumWindows(MyCallback, &Info);
}
于 2010-03-04T19:15:20.983 に答える
0

アダプターは私にとって素晴らしい働きをしました。これは、自動保存を実行するためにEnumChildWindowで使用していたコードのサンプルです。

ヘッダーファイル:

public:

    BOOL AutosaveTimerChildProc( HWND hwnd );
    static BOOL CALLBACK CallbackAdapter(HWND wnd, LPARAM lp);
...

C ++ファイル:

BOOL CMainFrame::InitInstance()
{
    SetTimer(0, 5 * 60 * 1000,NULL);
    return TRUE;
}

void CMainFrame::OnTimer(UINT nIDEvent)
{
    ::EnumChildWindows(m_hWnd,&CMainFrame::CallbackAdapter,NULL);
}

BOOL CMainFrame::AutosaveTimerChildProc(HWND hwnd)
{
    if(DYNAMIC_DOWNCAST(CVISIONView,CWnd::FromHandle(hwnd)) != NULL)
    {
        ::PostMessage(hwnd,WM_MYVIEW_AUTOSAVETIMER,0,0);
    }

    return TRUE;
}

BOOL CMainFrame::CallbackAdapter(HWND wnd, LPARAM lp)
{
    CMainFrame* that = reinterpret_cast<CMainFrame*>(lp);
    return that->AutosaveTimerChildProc(wnd);
}
于 2013-03-12T12:22:23.517 に答える
-1

this見てください、すべてのクラスの非静的メソッドには、クラスのインスタンスへのポインターであるもう1つの非表示パラメーター(最初のパラメーター)があります。したがって、実際の署名は次のとおりです。

BOOL CALLBACK My_EnumWindowsProc(MyClass* this, HWND hwnd, LPARAM lParam);

今はもっとはっきりしていますか?これは、このコンテキストでは使用できないことを意味します

于 2010-03-04T18:36:33.450 に答える