0

私は、イベントループ全体とそのようなものすべてを自分で実装しているWindowsアプリケーションに取り組んでいます(それには理由があります)。ある場所では、ウィンドウが表示された後にコードを実行する必要があります。通常、ウィンドウが作成されると、WM_CREATE メッセージが受信されたときに初期化が行われます。WM_SHOWWINDOW は、ウィンドウが表示される直前に送信されます。ただし、ウィンドウが初めて表示された直後にコードを実行する必要があります。ウィンドウが表示された後に送信された通知メッセージが見つからないようです。一つも無いのではないでしょうか?

もちろん、ロジックを実行したかどうかを示すブール値 (FirstRun) を保持し、WM_ACTIVATE を受信したときにブール値が TRUE の場合にコードを実行し、FirstRun を FALSE に設定して、コードが実行されないようにすることができます。次回は WM_ACTIVATE を受け取るのですが、これはちょっと不自然に思えます。

このレベルで win32 プログラミングを行ってから何年も経っているので、あまり覚えていません。ここで最善のアプローチは何ですか?

4

3 に答える 3

4

特別な通知はありませんが、多くの場合、次のトリックを使用できます。

LRESULT CALLBACK MainWndProc(
HWND hwnd,        // handle to window
UINT uMsg,        // message identifier
WPARAM wParam,    // first message parameter
LPARAM lParam)    // second message parameter
{ 
switch (uMsg) 
{ 
    case WM_USER + 100:
        //window is just displayed, do some actions
        return DefWindowProc(hwnd, uMsg, wParam, lParam); 
    case WM_CREATE:
        PostMessage(hwnd, WM_USER + 100, 0, 0);
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    default: 
        return DefWindowProc(hwnd, uMsg, wParam, lParam); 
}
return 0;
}
于 2011-09-20T13:45:50.557 に答える
0

それが WM_SHOWWINDOW の目的であるため、1 つもありません。そのメッセージがデフォルトのメッセージ処理手順に渡されると、ウィンドウが表示されます。あなたができる最善のことは、ある種のタイマーを介してIsWindowVisibleでポーリングすることです。

このようなものに頼らなければならないのに、プログラムの設計に欠陥があるようです。あなたは何をしようとしているのですか?

于 2011-09-20T12:28:44.007 に答える