0

メッセージをサーバーに送信し、メッセージを受信する関数で api ライブラリを使用しようとしています。関数の引数の 1 つが HWND であり、ライブラリ ドキュメントには、メッセージが HWND によって受信されることが示されています。受信したメッセージを読むために、いくつかの MFC ドキュメントを調べ、メッセージを処理する関数を持つ CDialog を継承するクラスを作成し、メッセージ マップを操作しようとしました。

しかし、これらの作業は、動作するダイアログ ウィンドウを作成するのではなく、コンソールに表示したり、コードの他の部分で使用したりできるようにメッセージ自体が必要な場合、少し面倒に思えました。では、MFC を気にせずに HWND からメッセージを単純に「抽出」する方法はありますか? そうでない場合、最も簡単な方法は何ですか?


API ドキュメントの詳細

クラスWrapperはdllライブラリファイルをメンバー関数にラップします。関数を使用しようとしていますBOOL Wrapper::Func1(HWND hWnd, DWORD msg, const char* inputStr)

クラスはMyDlg継承し、そのクラス メンバーとしてCDialog持ちます。Wrapper m_wrp

LRESULT MyDlg::HandleEvent(WPARAM w, LPARAM l)受信したデータを出力して返すメンバー関数ですTRUE

MyDlgのメンバー関数が定義されている cpp ファイルの途中にこのコードがあります。inputStrによってサーバーに送信されたものは何でもWrapper::Func1、同じメッセージCA_01が受信されるようです。CA_01別のヘッダー ファイルで定義された const DWORD です。いくつかの検索の後、これはメッセージを継続的にチェックし、MSGwithが受信された場合は.:msg = CA_01を呼び出す部分であると思います。HandleEvent

BEGIN_MESSAGE_MAP(MyDlg, CDialog)
    ON_MESSAGE(CA_01, HandleEvent)
END_MESSAGE_MAP()

作成するボタンがあり、MyDlg押すと入力テキストが読み込まれ、void MyDlg::OnSend()呼び出され、m_wrp.Func1(...)呼び出されます。

void MyDlg::OnSend(){
    CString strData;
    m_editData.GetWindowText(strData);
    m_wrp.Func1(GetSafeHwnd(), CA_01, strData);
}

このサンプル コードを API ドキュメントからテストしたところ、問題なく動作しました。編集可能なテキスト ボックスとボタンを含むウィンドウが表示されます。テキストを入力してボタンを押すと、数秒後に受信したメッセージが表示されます。

ただし、Wrapperインスタンスを作成し、while ループ内でFunc1PeekMessage を使用してメッセージを呼び出して受信しようとすると、何も起こりません。

HWND hWnd = CreateWindowW(L"static", L"", 0, 0, 0, 0, 0, HWND_MESSAGE, nullptr, nullptr, nullptr);
MSG msg;
Wrapper m_wrp;
CString inputStr = "test";

while (true){
    m_wrp.Func1(hWnd, CA_01, inputStr);
    if (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) {
        std::cout << "Got message: " << msg.message << std::endl;
    }
    else {
        std::cout << "No messages, sleep" << std::endl;
        Sleep(2000);
    }
}

これは、ON_MESSAGE(...) と PeekMessage(...) の違いによるものですか?

4

1 に答える 1