8

Microsoft Windowsでは、これは機能します。

 mnu := GetSystemMenu(h, false);
 EnableMenuItem(mnu, SC_CLOSE, MF_BYCOMMAND or MF_GRAYED);

しかし、これは機能しません:

 mnu := GetSystemMenu(h, false);
 EnableMenuItem(mnu, SC_MOVE, MF_BYCOMMAND or MF_GRAYED);

したがって、ウィンドウの「閉じる」システムメニュー項目を無効にする方法は知っていますが、「移動」項目は無効にしません。それ、どうやったら出来るの?

アップデート

もちろん、非常に優れた関数EnableMenuItemを使用する代わりに、SetMenuItemInfoを使用することもできます。

  FillChar(info, sizeOf(info), 0);
  with info do
  begin
    cbSize := sizeOf(info);
    fMask := MIIM_STATE;
    fState := MFS_GRAYED;
  end;
  SetMenuItemInfo(mnu, SC_MOVE, false, info);

しかし、これもSC_CLOSEでは完全に機能しますが、SC_MOVEではまったく機能しません。

アップデート2

問題は、いわば「仕事をする」という動作コードが見つかったという意味で解決されますが、問題の原因に関する仮説を聞くことは興味深いでしょう。SC_CLOSEは機能するが、SC_MOVEは機能しないのはなぜですか。

4

2 に答える 2

6

少し謎ですが、ModifyMenu または DeleteMenu を使用すると機能します。

   HMENU mnu = GetSystemMenu(hWnd, false);
   DeleteMenu(mnu, SC_MOVE, MF_BYCOMMAND);

また:

   HMENU mnu = GetSystemMenu(hWnd, false);
   MENUITEMINFO info = { sizeof(MENUITEMINFO) };
   TCHAR name[256] = _T("Cannot move");
   info.fMask = MIIM_TYPE;
   info.dwTypeData = name;
   info.cch = sizeof(name) / sizeof(TCHAR);
   GetMenuItemInfo(mnu, SC_MOVE, false, &info);
   ModifyMenu(mnu, SC_MOVE, MF_BYCOMMAND | MF_GRAYED, 0, info.dwTypeData);
于 2010-04-08T19:15:03.123 に答える
4

を使用してメニュー項目を破棄するDeleteMenu()と、アプリケーションを移動できなくなります (カーソルを使用しても)。

重要なのは、アイテムを一時的に削除することです。

まず、次のステートメントを使用して、"Move" アイテムのキャプションを保存します。

GetMenuString(hMenu, SC_MOVE, szMoveCaption, MAX_PATH, MF_BYCOMMAND);

次に、メニューから項目を削除します。

RemoveMenu(hMenu, SC_MOVE, MF_BYCOMMAND);

「Move」項目を元に戻す必要がある場合は、InsertMenu() を使用します。

InsertMenu(hMenu, 0, MF_BYPOSITION, SC_MOVE, szMoveCaption);

PS。

于 2011-05-05T12:30:12.850 に答える