メッセージをサーバーに送信し、メッセージを受信する関数で 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 です。いくつかの検索の後、これはメッセージを継続的にチェックし、MSG
withが受信された場合は.: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 ループ内でFunc1
PeekMessage を使用してメッセージを呼び出して受信しようとすると、何も起こりません。
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(...) の違いによるものですか?