AsuYuHomepage
トップページ サイトの説明 子供の成長記録 JM BAR Delphi リンク集
Home>>プログラミング>>Tips&Tricks>>システムメニューを削除する
Delphi Tips
Delphi Win32API
ダウンロード

Delphi Tips & Tricks

フォーム・タスクバーのシステムメニューを削除する

 ウィンドウの右上の最大化・最小化・閉じるボタンを無効化したり、タイトルバーを右クリックすると表示されるメニューから項目を削除します。 単に最大化と最小化を削除したいなら、TFormのBorderIconsプロパティを変更することで実現できます。
 ちなみにタスクバーの右クリックメニューはTApplicationのものなので、TApplicationのシステムメニューを取得し操作することができます。
procedure TForm1.Formcreate(Sender: TObject);
var
  hSysmenu :hMenu;
begin
  hSysmenu :=GetSystemMenu(Handle, false);
  //フォームのシステムメニューのハンドルを取得
  DeleteMenu(hSysMenu, 0, MF_BYPOSITION);
  //上から1つ目のメニューを削除
  DeleteMenu(hSysMenu, 1, MF_BYPOSITION);
  //上から2つ目のメニューを削除
  DeleteMenu(hSysMenu, SC_CLOSE, MF_BYCOMMAND);
  //閉じるメニューを無効化
end;

//タスクバーに表示されるメニューを操作(最小化を削除)
procedure TForm1.Button1Click(Sender: TObject);
begin
  DeleteMenu(GetSystemMenu(Application.Handle, false), SC_MINIMIZE, MF_BYCOMMAND);
end;

 最初にhMenu型の変数 hSysmenuを宣言しておきます。
そして GetSystemMenu関数でシステムメニューのハンドルを得てから、そのハンドルを使いDeleteMenu関数でメニュー項目を削除しています。
 GetSystemMenuの第一引数はシステムメニューを取得したいウィンドウのハンドルを指定します。今回は
form1のウィンドウハンドルであるForm1.Hanleを指定してします。第二引数はfalseでいいです。
 DeleteMenuの第一引数は上で得たメニューハンドルhSysmenuを指定します。サンプルコードの1、2回目のDeleteMenuのように第三引数にMF_BYPOSITIONを指定した場合、第二引数は削除する項目をメニューの上からみた順番で指定します。(一番上は0、2番目は1...)3回目のように第三引数にMF_BYCOMMANDを指定すると第二引数はメニューの種類を特定する定数を指定します。
■MF_BYCOMMANDのときに指定できる定数■
元のサイズに戻す SC_RESTORE 最小化 SC_MINIMIZE
移動 SC_MOVE 最大化 SC_MAXIMIZE
サイズ変更 SC_SIZE 閉じる SC_CLOSE
 function GetSystemMenu(hWnd :HWND; bRevert :LongBool):HMENU;
 function DeleteMenu(hMenu :HMENU; uPosition :Cardinal; uFlags :Cadinal):LongBool;

※追記
フォームのメニューを変更しても、タスクバーの右クリックで表示されるメニューはその影響を受けません。その理由はDelphiのアプリケーションでは TApplication がすべてのフォームのオーナードウィンドウだからです。TApplicationはスクリーンの(0,0)に位置に幅・高さともに 0pxのウィンドウです。(Visibleですが大きさがないため見えません)
 そのためタスクバーのメニューの操作にはフォームのメニューの操作とは別にAppication.Handleを使ってそのシステムメニューのハンドルを取得する必要があるのです。