|
|
||||
Tips > |
|||||
スタートメニューを開く(SetForegroundWindow) |
更新 : 2014/09/23 |
||||
|
|
||
解説: Windows の諸々のウィンドウ(コントロールパネルやスタートボタンなど)をコーディングで開きたい時があります。 ここでは、Win32API の SetForegroundWindow 関数を使ってこれらを実現してみます。 SetForegroundWindow 関数は、ウィンドウを生成したスレッドをフォアグラウンドにすることができます。これで指定ウィンドウがアクティブになります。 ちょっと寄り道: BOOL SetForegroundWindow( HWND hWnd // ウィンドウのハンドル ); 引数 hWnd:アクティブにするウィンドウのハンドルを指定 戻り値 ウィンドウがフォアグラウンドになれば、0 以外の値、フォアグラウンドにならなかったら、0 が返ります。 使用例: アプリケーションを起動して Button をクリックすると スタートメニューが開きます。 コンポーネントは、Button を適当に配置するだけです。 Button1 の OnClick イベントで、FindWindow 関数を使って、タスクバーのウインドウ・ハンドルを取得します。 次に取得したウインドウ・ハンドルを SetForegroundWindow 関数に渡し、PostMessage 関数で Win32API の WM_SYSKEYDOWN(システムキー押下開始時)メッセージを送ります。 WM_USER には、0x0104 を加算して、強制的にウィンドウをアクティブにする独自ウィンドウメッセージとしています。 興味のある方は、Windows の他のウィンドウをアクティブにしてみてください。 //------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { // スタートメニューを開く HWND hTaskBar = FindWindow(PChar("Shell_TrayWnd"), NULL); if (SetForegroundWindow(hTaskBar)) { // アプリケーション定義のメッセージを (WM_USER + X) の形で定義 PostMessage(hTaskBar, WM_USER + 0x0104, 0, 0); }; } //------------------------------------------------------------------- |