-1

「読み取り専用」に設定されていないテキストボックスがあるので、理論的には書き込みができるはずです。Edit_Enable(hwnd, true)、Edit_SetReadOnly(hwnd, false)、および SetFocus(hwnd) でアクティブ化されます。テキストボックスをクリックしてフォーカスを与えることができ、キャレットが点滅していることもわかりますが、任意のキーを押してもテキストボックスに入力がありません。Edit_SetText() でテキストを設定できますが、手動で何も書き込むことはできません。

次のコードでこのテキストボックスを作成します。

DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOVSCROLL /*| ES_OEMCONVERT*/ | ES_LEFT /*| ES_WANTRETURN */| WS_TABSTOP;
        HWND h = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", (LPCWSTR)NULL, dwStyle, posX, posY, width, height, hParent, NULL, (HINSTANCE)GetModuleHandle(NULL), NULL);

メッセージはこの関数で処理されます。フレームごとに呼び出されます。

bool PumpMessages()
{
    MSG msg;
    ZeroMemory( &msg, sizeof(MSG) );

    bool bQuit = false;

    // Use PeekMessage() so we can use idle time to update the system. 
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        // Translate and dispatch the message
        TranslateMessage(&msg);

        // message bug workaround
        if (msg.message == WM_QUIT)
        {
            bQuit = true;
        }

        DispatchMessage(&msg);
    }

    return bQuit;
}

メッセージの手順は次のようになります。

   LRESULT CALLBACK Window::WndProcThunk(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
   {
   if (msg == WM_CHAR)
       Log("WM_CHAR");
    ...
   // Finally, if the message isn't consumed by the window or any registered listeners, let Windows do its thing.
    return msgConsumed ? 0 : DefWindowProc(hWnd, msg, wParam, lParam);
   }

2 番目の奇妙なことは、WndProcThunk メッセージ プロシージャで発生します。WM_CHAR メッセージは記録されません。これが、TextBox が何もしない理由だと思います。ユーザーのキーが押されたときに反応するには WM_CHAR メッセージが必要だからです。PumpMessages 関数で TranslateMessage() を使用しているにもかかわらず、WM_CHAR メッセージが送信されない理由を見つける必要があります。何か案は?

4

2 に答える 2

0

DirectInput API を無効にすることで問題を解決しました。DirectInput 8 は実際にはすべての WM_KEYDOWM メッセージを食べていたため、WM_CHAR メッセージが送信されませんでした。ただし、テキストボックスには、ユーザー入力に反応する WM_CHAR メッセージが必要です。これは API の奇妙な動作です。DirectInput を無効にせずにこの問題を解決するアイデアがあれば、遠慮なく投稿してください。しかし、これからはキーボード入力に GetAsyncKeyState() を使用します。

于 2013-03-18T11:11:55.553 に答える
0

PeekMessageメッセージキューにメッセージがない場合は戻りFALSEます。そのため、メッセージループはすぐに終了します。の戻り値ではなく、フラグをテストとして使用するように、使用に切り替えるかGetMessageループをリファクタリングする必要があります。bQuitPeekMessage

于 2013-03-17T20:50:50.757 に答える