2016-01-30 35 views
1

當菜單項被禁用,然後在控制應用程序中將代碼「PostMessage」傳遞給崩潰,因爲我需要檢查菜單項是Enabled,然後使用PostMessage。檢查菜單項在Delphi中使用API​​ Win32

HandleMenu:= GetMenu(ParentAppHandle); 
    HandleMenu:= GetSubMenu(HandleMenu, 6 {menu item no}); 
    item:= GetMenuItemID(HandleMenu , 12 {sub menu item no}); 

    PostMessage(ParentAppHandle, WM_COMMAND, MakeWParam(item, 0), 0); 
+0

[GetMenuItemInfo](https://msdn.microsoft.com/en-us/library/windows/desktop/ms647980.aspx)。 – IInspectable

+0

如果您爲禁用的菜單項發送了「WM_COMMAND」消息,則接收應用程序應忽略該消息。如果接收器崩潰,接收器編碼不正確。這不是發件人的錯。另外,請確保菜單所有者擁有正確的'HWND'。一些應用程序框架爲菜單分派創建了一個專用的'HWND'。 –

回答

2

使用WinAPI功能GetMenuState

實施例:

var 
    State: UINT; 
begin 
    State:= GetMenuState(HandleMenu , 12, MF_BYPOSITION); 
    if (State and (MF_DISABLED or MF_GRAYED)) = 0 then 
    begin 
    // Menu Item is enabled 
    end 
    else 
    begin 
    // Menu Item is disabled 
    end; 
+0

從[GetMenuState](https://msdn.microsoft.com/en-us/library/windows/desktop/ms647982.aspx):*「** GetMenuState **函數已被[** GetMenuItemInfo * *](https://msdn.microsoft.com/en-us/library/windows/desktop/ms647980.aspx)「*。使用'GetMenuItemInfo'的一個原因是,你不再需要編寫兼容性代碼,同時檢查已禁用和灰色。當使用'GetMenuItemInfo'時,它們被報告爲相同的值。 – IInspectable