コード例 #1
0
ファイル: MainWindow.xaml.cs プロジェクト: x1unix/Cupertino
        private void OnAppMenuSelect(IWindowRef.MenuItemRef mRef)
        {
            Debug.WriteLine("Selected Item {0}@{1} {2} (Root: {3:x8}, Local: {4:x8})", mRef.Index, mRef.Ref, mRef.Label, mRef.RootMenuHandle, mRef.MenuHandle);
            IntPtr hWnd = State.LastWindowHandle;

            tracker.SendMenuItemAction(hWnd, mRef);
            //Task.Run(() => tracker.SendMenuItemAction(hWnd, mRef));
        }
コード例 #2
0
ファイル: MenuItemViewModel.cs プロジェクト: x1unix/Cupertino
        public MenuItemViewModel(IWindowRef.MenuItemRef mRef, CommandHandler cmdHandler)
        {
            IsSeparator = mRef.IsSeparator;
            if (IsSeparator)
            {
                return;
            }

            _command  = new CommandViewModel(cmdHandler, mRef);
            Header    = mRef.Label.Replace('&', '_'); // Replace '&' MFC menu mnemonic char with wpf's '_'
            MenuItems = FromMenuRef(mRef.SubMenu, cmdHandler, false);
        }
コード例 #3
0
ファイル: WindowTracker.cs プロジェクト: x1unix/Cupertino
        public void SendMenuItemAction(IntPtr hWnd, IWindowRef.MenuItemRef menuItem)
        {
            //IntPtr wParam = (IntPtr)menuItem.Ref;
            //IntPtr lParam = menuItem.MenuHandle;
            //SendMessage(hWnd, WindowMessage.WM_MENUSELECT, wParam, lParam);
            Debug.WriteLine("SendMessage: {0:x8}, {1}, {2:x}, {3:x}",
                            hWnd, WindowMessage.WM_COMMAND, (IntPtr)menuItem.MenuHandle, IntPtr.Zero);
            SendMessage(hWnd, WindowMessage.WM_COMMAND, (IntPtr)menuItem.MenuHandle, IntPtr.Zero);

            //IntPtr szString = Marshal.StringToHGlobalUni(new string("blablabla"));
            //SendMessage(hWnd, WindowMessage.WM_SETTEXT, (IntPtr) 0, szString);
            //Marshal.FreeHGlobal(szString);
        }
コード例 #4
0
ファイル: WindowTracker.cs プロジェクト: x1unix/Cupertino
        private unsafe List <IWindowRef.MenuItemRef> GetMenuItems(IntPtr hMenu, IntPtr rootHandle)
        {
            // ref: https://stackoverflow.com/questions/18589385/retrieve-list-of-menu-items-in-windows-in-c
            // ref: https://stackoverflow.com/questions/22852461/win32-api-getmenuiteminfo-returns-only-the-first-character-of-the-item-text
            int nCount = GetMenuItemCount(hMenu);

            if (nCount <= 0)
            {
                return(null);
            }

            MenuMembersMask fMask = MenuMembersMask.MIIM_SUBMENU | MenuMembersMask.MIIM_FTYPE | MenuMembersMask.MIIM_ID | MenuMembersMask.MIIM_STRING;
            List <IWindowRef.MenuItemRef> list = new List <IWindowRef.MenuItemRef>();
            MENUITEMINFO mii = new MENUITEMINFO();

            for (uint i = 0; i < nCount; i++)
            {
                MENUITEMINFO mif = mii.Create();
                mif.dwTypeData = null;
                mif.fMask      = fMask;
                if (!GetMenuItemInfo(hMenu, i, true, ref mif))
                {
                    throw new Win32Exception();
                }

                switch (mif.fType)
                {
                case MenuItemType.MFT_SEPARATOR:
                    list.Add(new IWindowRef.MenuItemRef {
                        Index = i, IsSeparator = true
                    });
                    break;

                case MenuItemType.MFT_STRING:
                    if (mif.cch <= 0)
                    {
                        break;
                    }
                    //if (rootHandle == IntPtr.Zero)
                    //{
                    //    Debug.WriteLine("{0} is zero, default is {1}", rootHandle, hMenu);
                    //}
                    IWindowRef.MenuItemRef item = new IWindowRef.MenuItemRef
                    {
                        RootMenuHandle = rootHandle == IntPtr.Zero ? hMenu : rootHandle,
                        MenuHandle     = hMenu,
                        Ref            = mif.wID,
                        Index          = i,
                        IsSeparator    = false
                    };
                    mif.cch++;
                    IntPtr szString = Marshal.AllocHGlobal((IntPtr)(sizeof(char) * mif.cch));
                    //IntPtr szString = Marshal.StringToHGlobalUni(new string('\0', mif.cch));
                    mif.dwTypeData = (char *)szString.ToPointer();
                    try
                    {
                        if (!GetMenuItemInfo(hMenu, i, true, ref mif))
                        {
                            throw new Win32Exception();
                        }
                        item.Label = Marshal.PtrToStringUni(szString);
                    }
                    finally
                    {
                        Marshal.FreeHGlobal(szString);
                    }

                    if (mif.hSubMenu != null)
                    {
                        item.SubMenu = new IWindowRef.MenuRef
                        {
                            Ref   = mif.hSubMenu,
                            Items = GetMenuItems(mif.hSubMenu, item.RootMenuHandle)
                        };
                    }
                    list.Add(item);
                    break;

                default:
                    break;
                }
            }

            return(list);
        }
コード例 #5
0
ファイル: MenuItemViewModel.cs プロジェクト: x1unix/Cupertino
 public CommandViewModel(MenuItemViewModel.CommandHandler action, IWindowRef.MenuItemRef item)
 {
     _action = action;
     _item   = item;
 }