시스템 메뉴에 항목을 추가하는 다음 코드가 있습니다. 내 문제는 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 cLANGMENU가있는 메뉴가 나타날 것이라고 기대하십니까? 왜 cLANGMENU는 WM_USER와 관련이 있습니까? 메시지 ID가 아닙니다. –
@David Heffernan - 실제로 처음으로 존재하지 않는 메뉴를 삭제하려고합니다. 메시지가 클릭 이벤트에서 catch되면 WM_USER와 관련됩니다 (예 : 다른 ID $ FF00으로 변경할 수 있음). 문제는 시스템 메뉴에서이 하위 메뉴를 삭제할 수 없다는 것입니다. 이 코드는 여러 번 실행해야하므로이 하위 메뉴를 삭제하고 다른 값으로 다시 삽입해야합니다. – RBA
'GetSystemMenu'의 두 번째 매개 변수로'True'를 전달하면, 메뉴 항목 삭제에 신경 쓸 필요가 없습니다. OS는 신선한 메뉴에 대한 핸들을 제공하고, 원하지 않는 항목을 삭제하려고하는 대신 원하는 항목을 추가 * 할 수 있습니다. –