我有以下代碼,它將項目添加到系統菜單。我的問題是DeleteMenu(SysMenu,cLANGMENU,MF_BYCOMMAND)沒有刪除添加到系統菜單的彈出式菜單。我不能理解的是,爲什麼工作項目(掃描組件)添加,但不是「程序語言」Delphi XE - 無法刪除系統菜單中的項目
procedure TForm1.Button1Click(Sender: TObject);
const aBaseItem : string = 'Programm-Sprache';
cSepSYSTEM_MENU = wm_user + 100;
cScanCompSystemMenu = wm_user + 101;
cLANGMENU = wm_user + 102;
SC_ITEM = $FF00;
var
MenuItemInfo: TMenuItemInfo;
PopupMenu: HMENU;
Result: Boolean;
SysMenu: HMenu;
iPos, NumItems : Integer;
wTemp1, wtemp2 : string;
Buffer: array[0..79] of Char;
begin
{Create the popup menu}
PopupMenu := CreatePopupMenu;
{Insert an item into it}
for iPos := 5 downto 0 do
begin
FillChar(MenuItemInfo, SizeOf(MenuItemInfo), iPos);
with MenuItemInfo do
begin
cbSize := SizeOf(MenuItemInfo);
fMask := MIIM_TYPE or MIIM_ID;
fType := MFT_STRING;
wID := SC_ITEM + iPos;
dwTypeData := PChar(inttostr(iPos));
cch := Length(dwTypeData) * 2 + 2; //4; {'Item' is 4 chars}
end;
Result := InsertMenuItem(PopupMenu, 0, True, MenuItemInfo);
Assert(Result, 'InsertMenuItem failed');
end;
SysMenu := GetSystemMenu(Handle, False);
//why this isn't working???
if not DeleteMenu(SysMenu, cLANGMENU, MF_BYCOMMAND) then
begin
ShowMessage('System Error Message: '+ SysErrorMessage(GetLastError)) ;
//error message is - operation completed succesfully
end;
{Insert the popup into the system menu}
FillChar(MenuItemInfo, SizeOf(MenuItemInfo), 0);
with MenuItemInfo do
begin
cbSize := SizeOf(MenuItemInfo);
fMask := MIIM_SUBMENU or MIIM_TYPE or MIIM_ID;
fType := MFT_STRING;
hSubMenu := PopupMenu;
wId := cLANGMENU;
dwTypeData := PChar('Test');//Before editing the question it was Program Language
cch := Length(dwTypeData) * 2 + 2; //7; {'SubMenu' is 7 chars}
end;
Assert(SysMenu <> 0);
Result := InsertMenuItem(SysMenu, GetMenuItemCount(SysMenu), True, MenuItemInfo);
Assert(Result, 'InsertMenuItem failed');
SysMenu := GetSystemMenu(Handle, False);
//delete menu if exists - this is working
DeleteMenu(SysMenu,cSepSYSTEM_MENU,MF_SEPARATOR);
DeleteMenu(SysMenu,cScanCompSystemMenu,MFT_STRING);
//add new ones
InsertMenu(SysMenu, Word(-1), MF_SEPARATOR, cSepSYSTEM_MENU, '');
FillChar(MenuItemInfo, SizeOf(TMenuItemInfo), #0);
with MenuItemInfo do
begin
cbSize := SizeOf(TMenuItemInfo);
fMask := MIIM_TYPE or MIIM_ID or MIIM_STATE;
fType := MFT_STRING;
wId := cScanCompSystemMenu;
dwTypeData := PChar('Scan components');
cch := Length('Scan components');
end;
Result := InsertMenuItem(SysMenu, GetMenuItemCount(SysMenu), True, MenuItemInfo);
Assert(Result, 'InsertMenuItem failed');
end;
LE:此代碼運行幾次,所以我需要刪除添加的項目每一次。 LE2:即使這個代碼是在Delphi(Object Pascal)中編寫的,它也會從Windows調用WinApi函數。也許有人在這方面工作過很多,而且是一名C/C++程序員可以提供幫助。
在添加之前,您似乎正在刪除該項目。爲什麼在添加之前,您會期望帶有ID cANGANGEN的菜單出現?爲什麼cLANGMENU與WM_USER相關?這不是消息ID。 – 2012-07-30 12:58:35
@David Heffernan - 的確,第一次嘗試刪除一個不存在的菜單。它與WM_USER相關,當消息被捕捉到click事件時(例如,這可以改變爲另一個ID $ FF00)。問題是,我無法從系統菜單中刪除此子菜單。此代碼必須運行多次,因此我需要刪除此子菜單,並使用不同的值再次插入它。 – RBA 2012-07-30 13:02:54
如果您通過'True'作爲'GetSystemMenu'的第二個參數,那麼您不必費心去刪除任何菜單項。操作系統會給你一個新菜單的句柄,然後你可以*添加*你想要的物品,而不是試圖刪除你不需要的物品。 – 2012-07-30 14:22:43