程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 對窗口的系統菜單(SystemMenu)的一些操作

對窗口的系統菜單(SystemMenu)的一些操作

編輯:關於.NET

有時候想禁用/移除/添加一些系統菜單項目,那麼你可能會用到下面的API,以C#平台調用為例:

[DllImport("User32.dll")]
internal static extern IntPtr GetSystemMenu(IntPtr hWnd, Int32 bRevert);

該函數用於獲取系統菜單句柄。hwnd參數是窗口句柄,表明你想要獲取哪個窗口的系統菜單;bRevert ,bool值,如果為假,那麼整個函數將返回原窗口的系統菜單的句柄拷貝;如果為真,則原窗口的系統菜 單將被重置,函數將返回0,很顯然這個函數就演變成 “重置窗口系統菜單”了。

[DllImport("User32.dll")]
internal static extern int GetMenuItemCount(IntPtr hMenu);

該函數用於獲取系系統菜單中的Item數目, hMenu為系統菜單句柄

[DllImport("User32.dll")]
internal static extern bool EnableMenuItem(IntPtr hMenu, Int32 uIDEnableItem,  Int32 uEnable);

該函數用於啟用或禁用系統菜單。hMenu為菜單句柄。uIDEnableItem表示操作項的Id或位置等(具體 的取決與第三個參數)。uEnable,一些標志它可以是:

internal const UInt32 MF_ENABLED      =0x00000000;
internal const UInt32 MF_GRAYED       =0x00000001;
internal const UInt32 MF_DISABLED     =0x00000002;
internal const UInt32 MF_BYCOMMAND    =0x00000000;
internal const UInt32 MF_BYPOSITION   =0x00000400;

如果uEnable是MF_BYPOSITION則uIDEnableItem應該傳入Index信息(0,1.....),如果是 MF_BYCOMMAND則應該傳入Id

[DllImport("user32.dll",CharSet=CharSet.Auto)]
  internal static extern int AppendMenu(int hMenu, int Flagsw, int  IDNewItem, string lpNewItem);

該換上用於在系統菜單中追加項目。hMenu為菜單句柄,IDNewItem參數需要你為新添加的Item創建的 ID,lpNewItem則是菜單文本,而嘛則是一些標志:

Flagsw
/*
下列標志可被設置在參數uFlags裡:
   MF_BITMAP:將一個位圖用作菜單項。參數lpNewltem裡含有該位圖的句柄。
   MF_CHECKED:在菜單項旁邊放置一個選取標記。如果應用程序提供一個選取標記,位圖(參見 SetMenultemBitmaps),則將選取標記位圖放置在菜單項旁邊。
   MF_DISABLED:使菜單項無效,使該項不能被選擇,但不使菜單項變灰。
   MF_ENABLED:使菜單項有效,使該項能被選擇,並使其從變灰的狀態恢復。
   MF_GRAYED:使菜單項無效並變灰,使其不能被選擇。
   MF_MENUBARBREAK:對菜單條的功能同MF_MENUBREAK標志。對下拉式菜單、子菜單或快捷菜單,新 列和舊列被垂直線分開。
   MF_MENUBREAK:將菜單項放置於新行(對菜單條),或新列(對下拉式菜單、子菜單或快捷菜單 )且無分割列。
   MF_OWNERDRAW:指定該菜單項為自繪制菜單項。菜單第一次顯示前,擁有菜單的窗口接收一個 WM_MEASUREITEM消息來得到菜單項的寬和高。然後,只要菜單項被修改,都將發送WM_DRAWITEM消息給菜 單擁有者的窗口程序。
   MF_POPUP:指定菜單打開一個下拉式菜單或子菜單。參數uIDNewltem下拉式菜單或子菜單的句柄 。此標志用來給菜單條、打開一個下拉式菜單或於菜單的菜單項、子菜單或快捷菜單加一個名字。
   MF_SEPARATOR:畫一條水平區分線。此標志只被下拉式菜單、於菜單或快捷菜單使用。此區分線 不能被變灰、無效或加亮。參數IpNewltem和uIDNewltem無用。
   MF_STRING:指定菜單項是一個正文字符串;參數lpNewltem指向該字符串。
   MF_UNCHECKED:不放置選取標記在菜單項旁邊(缺省)。如果應用程序提供一個選取標記位圖( 參見SetMenultemBitmaps),則將選取標記位圖放置在菜單項旁邊。
   下列標志組不能被一起使用:
   MF_DISABLED,MF_ENABLED和MF_GRAYED;MF_BITMAP,MF_STRING和MF_OWNERDRAW
   MF_MENUBARBREAK和MF_MENUBREAK;MF_CHECKED和MF_UNCHECKED
   Windows CE環境下,不支持參數fuFlags使用下列標志:
   MF_BITMAP;MF_DOSABLE;MF_GRAYED
   MF_GRAYED可用來代替MF_DISABLED和MFS_GRAYED。
   Windows CE 1.0不支持層疊式菜單。在使用Windows CE 1.0時,不能將一個MF_POPUP菜單插 入到另一個下拉式菜單中。Window CE 1.0不支持下列標志:
   MF_POPUP;MF_MENUBREAK;MF_MENUBARBREAK
   Windows CE 2.0或更高版本中,支持上述標志,也支持層疊式菜單。
*/

[DllImport("user32.dll")]

internal static extern bool DeleteMenu(IntPtr hMenu, uint uPosition, uint uFlags);

該函數用於刪除系統菜單項。hMenu為菜單句柄。uPosition表示操作項的Id或位置等(具體的取決與 第三個參數)。uFlags,一些標志它可以是:

internal const UInt32 MF_DISABLED     =0x00000002;
internal const UInt32 MF_BYCOMMAND    =0x00000000;

如果uEnable是MF_BYPOSITION則uIDEnableItem應該傳入Index信息(0,1.....),如果是 MF_BYCOMMAND則應該傳入Id

[DllImport("User32.dll")]
internal static extern int DrawMenuBar(IntPtr hWnd);

該函數用於重繪菜單,hWnd的菜單句柄。禁用/移除/添加一些系統菜單項目後,別忘了調用該函數重 繪一下。

下面是一段示例代碼:

internal static bool RemoveUnwantedSystemMenuItems(this Window window)
         {
             if (window == null)
             {
                 return false;
             }
             var winHelper = new WindowInteropHelper(window);
             IntPtr hwnd = winHelper.Handle;
             IntPtr sysMenu = GetSystemMenu(hwnd, 0);
             // 6 close, 5 splite line, 4 Maximize, 3 Minimize, 2  Size, 1 Move, 0 Restore
             // notes that, delete from bigger index to smaller
             bool deletedAll = DeleteMenu(sysMenu, 5, MF_BYPOSITION)  &
                               DeleteMenu(sysMenu, 4,  MF_BYPOSITION) &
                               DeleteMenu(sysMenu, 3,  MF_BYPOSITION) &
                               DeleteMenu(sysMenu, 0,  MF_BYPOSITION);
             DrawMenuBar(sysMenu);
             return deletedAll;
         }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved