HWND button = CreateWindowEx(0, "BUTTON", ...);
SetFocus(button); // Button no get focus! :(
また、フォームに SetFocus() できる他のコントロールがあります。
ありがとう、マーティン
私がこれをしなければならなかったので、それは永遠に続きました、しかし...
これがダイアログの場合、PostMessage() を介して WM_NEXTDLGCTL を送信するように伝えます。デフォルトのダイアログ項目メッセージ ハンドラーが残りの処理を行い、キーボード フォーカスと選択のアクティブ化を設定します。ただし、これを正しく読むと、これは別のケースになります。その場で生の親ウィンドウと子ウィンドウの両方を作成しています。この場合は、親ウィンドウに SetFocus() を実行し、親ウィンドウを最前面に移動して WM_SETFOCUS を処理し、子ウィンドウにフォーカスを設定します。WM_SETFOCUS と WM_KILLFOCUS は、コントロールの「アクティブ化」状態を切り替えることができるように設計されており、ほとんどの場合、それを処理します (ウィンドウがオーナー ドロー コントロールなどでない限り)。ただし、生のウィンドウでは、ベースの親ウィンドウにフォーカスが送信されたときに、適切な子がフォーカスを持っていることを適切に確認する必要があります。任意のものを再ホストします (独自の「ダイアログ」を管理していると考えてください)。繰り返しますが、これがダイアログの場合、通常、これはデフォルトのダイアログ手順によって行われますが、生のウィンドウであるため、自分ですべてを管理するのに行き詰まります。
方法は想像できませんが、少しでも役に立てば幸いです。
WS_TABSTOP
ボタンにスタイルを設定してみてください。
WM_INITDIALOG メッセージに応答してそのボタンを作成する場合は、FALSE を返して、ダイアログ ボックスの手順でフォーカスが変更されないようにする必要があります。
SetFocus はプロシージャではなく関数です。関数として呼び出し、戻り値を確認します。CreateWindowEx() 呼び出しでエラーが発生し、「ボタン」が有効なハンドルではないか、スレッドのメッセージ キューに関連付けられていないウィンドウであるため、返される値が null であるか、または戻り値が null ではない (現在は前にフォーカスされたウィンドウのハンドル)、フォーカスがあります (しかし、どういうわけかそれを検出できません)。