Esempio n. 1
0
        public void SafeResourceIdTest(string s)
        {
            var r = new SafeResourceId(s);

            Assert.That(r.IsInvalid, Is.False);
            Assert.That(r.ToString(), Is.EqualTo(s));
            Assert.That((string)r, Is.EqualTo(s));
            Assert.That((int)r, Is.EqualTo(0));
            Assert.That(r.GetHashCode(), Is.Not.Zero);
        }
Esempio n. 2
0
        public void SafeResourceIdTest2()
        {
            var r = new SafeResourceId(ResourceType.RT_BITMAP);

            Assert.That(r.IsInvalid, Is.False);
            Assert.That(r.ToString(), Does.StartWith("#"));
            Assert.That((string)r, Does.StartWith("#"));
            Assert.That((int)r, Is.EqualTo(2));
            Assert.That(((IntPtr)r).ToInt32(), Is.EqualTo(2));
        }
Esempio n. 3
0
        public void SafeResourceIdTest1(int s)
        {
            var r = new SafeResourceId(s);

            Assert.That(r.IsInvalid, Is.False);
            Assert.That(r.ToString(), Does.StartWith("#"));
            Assert.That((string)r, Does.StartWith("#"));
            Assert.That((int)r, Is.EqualTo(s));
            Assert.That(((ResourceId)r).id, Is.EqualTo(s));
        }
Esempio n. 4
0
        protected virtual Icon GetIcon(SafeResourceId name, Size size)
        {
            var hIcon = LoadImage(hLib, name, LoadImageType.IMAGE_ICON, size.Width, size.Height,
                                  LoadImageOptions.LR_LOADTRANSPARENT);

            if (hIcon == IntPtr.Zero)
            {
                throw new Win32Exception();
            }
            var ico = (Icon)Icon.FromHandle(hIcon).Clone();

            DestroyIcon(hIcon);
            return(ico);
        }
Esempio n. 5
0
        protected virtual Bitmap GetBitmap(SafeResourceId name, Size size)
        {
            var hBmp = LoadImage(hLib, name, LoadImageType.IMAGE_BITMAP, size.Width, size.Height,
                                 LoadImageOptions.LR_DEFAULTCOLOR);

            if (hBmp == IntPtr.Zero)
            {
                throw new Win32Exception();
            }
            var bmp = (Bitmap)Image.FromHbitmap(hBmp).Clone();

            DestroyIcon(hBmp);
            return(bmp);
        }
Esempio n. 6
0
        protected virtual Icon GetGroupIcon(SafeResourceId name)
        {
            const int szGrpIconDirEntry = 14;   // sizeof(GRPICONDIRENTRY)
            const int sIconDir          = 6;    // sizeof(ICONDIR)
            const int sIconDirEntry     = 16;   // sizeof(ICONDIRENTRY)

            var srcBuf = GetResourceData(name, ResourceType.RT_GROUP_ICON);

            // Convert the resource into an .ico file image.
            using (var destStream = new MemoryStream())
                using (var writer = new BinaryWriter(destStream))
                {
                    int count     = BitConverter.ToUInt16(srcBuf, 4);         // ICONDIR.idCount
                    var imgOffset = sIconDir + sIconDirEntry * count;

                    // Copy ICONDIR.
                    writer.Write(srcBuf, 0, sIconDir);

                    for (var i = 0; i < count; i++)
                    {
                        // Copy GRPICONDIRENTRY converting into ICONDIRENTRY.
                        writer.BaseStream.Seek(sIconDir + sIconDirEntry * i, SeekOrigin.Begin);
                        writer.Write(srcBuf, sIconDir + szGrpIconDirEntry * i, sIconDirEntry - 4); // Common fields of structures
                        writer.Write(imgOffset);                                                   // ICONDIRENTRY.dwImageOffset

                        // Get picture and mask data, then copy them.
                        var nId    = BitConverter.ToUInt16(srcBuf, sIconDir + szGrpIconDirEntry * i + 12);              // GRPICONDIRENTRY.nID
                        var imgBuf = GetResourceData(nId, ResourceType.RT_ICON);

                        writer.BaseStream.Seek(imgOffset, SeekOrigin.Begin);
                        writer.Write(imgBuf, 0, imgBuf.Length);

                        imgOffset += imgBuf.Length;
                    }

                    destStream.Seek(0, SeekOrigin.Begin);
                    return(new Icon(destStream));
                }
        }
Esempio n. 7
0
        public void SafeResourceIdTest3()
        {
            const string s    = "Test";
            var          sptr = new SafeCoTaskMemString(s);
            var          r    = new SafeResourceId((IntPtr)sptr);

            sptr.Dispose();
            Assert.That(r.IsInvalid, Is.False);
            Assert.That(r.ToString(), Is.EqualTo(s));
            Assert.That((string)r, Is.EqualTo(s));
            Assert.That((int)r, Is.EqualTo(0));

            const int i = 5;

            r = (IntPtr)i;
            Assert.That(r.Equals((IntPtr)i));
            Assert.That(r.IsInvalid, Is.False);
            Assert.That(r.ToString(), Does.StartWith("#"));
            Assert.That((string)r, Does.StartWith("#"));
            Assert.That((int)r, Is.EqualTo(i));
            Assert.That(((IntPtr)r).ToInt32(), Is.EqualTo(i));
        }
Esempio n. 8
0
        /// <summary>Get binary image of the specified resource.</summary>
        /// <param name="name">The resource name.</param>
        /// <param name="resourceType">Type of the resource.</param>
        /// <returns>Binary image of the resource.</returns>
        public byte[] GetResourceData(SafeResourceId name, ResourceType resourceType)
        {
            // Get binary image of the specified resource.

            var hResInfo = FindResource(hLib, name, resourceType);

            if (hResInfo.IsNull)
            {
                throw new Win32Exception();
            }

            var hResData = LoadResource(hLib, hResInfo);

            if (hResData.IsNull)
            {
                throw new Win32Exception();
            }

            var hGlobal = LockResource(hResData);

            if (hGlobal == IntPtr.Zero)
            {
                throw new Win32Exception();
            }

            var resSize = SizeofResource(hLib, hResInfo);

            if (resSize == 0)
            {
                throw new Win32Exception();
            }

            var buf = new byte[resSize];

            Marshal.Copy(hGlobal, buf, 0, buf.Length);
            return(buf);
        }
Esempio n. 9
0
        protected virtual Icon GetIcon(SafeResourceId name, Size size)
        {
            var hIcon = new SafeHICON(LoadImage(hLib, name, LoadImageType.IMAGE_ICON, size.Width, size.Height, LoadImageOptions.LR_LOADTRANSPARENT));

            return(!hIcon.IsNull ? hIcon.ToIcon() : throw new Win32Exception());
        }
Esempio n. 10
0
        protected virtual Bitmap GetBitmap(SafeResourceId name, Size size)
        {
            var hBmp = new SafeHBITMAP(LoadImage(hLib, name, LoadImageType.IMAGE_BITMAP, size.Width, size.Height, LoadImageOptions.LR_DEFAULTCOLOR));

            return(!hBmp.IsNull ? hBmp.ToBitmap() : throw new Win32Exception());
        }
Esempio n. 11
0
 public IList <ResourceId> GetResourceNames(SafeResourceId type) => EnumResourceNamesEx(hLib, type);
Esempio n. 12
0
        public static Task <bool> InvokeVerbAsync(string[] RelatedPath, string Verb, int Id, bool IncludeExtensionItem)
        {
            if (RelatedPath.Length > 0)
            {
                return(Helper.ExecuteOnSTAThreadAsync(() =>
                {
                    try
                    {
                        if (Array.TrueForAll(RelatedPath, (Path) => File.Exists(Path) || Directory.Exists(Path)))
                        {
                            Shell32.IContextMenu ContextObject = GetContextMenuObject(RelatedPath);

                            using (User32.SafeHMENU Menu = User32.CreatePopupMenu())
                            {
                                if (ContextObject.QueryContextMenu(Menu, 0, 0, 0x7FFF, (IncludeExtensionItem ? Shell32.CMF.CMF_EXTENDEDVERBS : Shell32.CMF.CMF_NORMAL) | Shell32.CMF.CMF_SYNCCASCADEMENU).Succeeded)
                                {
                                    if (!string.IsNullOrEmpty(Verb))
                                    {
                                        using (SafeResourceId VerbId = new SafeResourceId(Verb))
                                        {
                                            Shell32.CMINVOKECOMMANDINFOEX VerbInvokeCommand = new Shell32.CMINVOKECOMMANDINFOEX
                                            {
                                                lpVerb = VerbId,
                                                lpVerbW = Verb,
                                                nShow = ShowWindowCommand.SW_SHOWNORMAL,
                                                fMask = Shell32.CMIC.CMIC_MASK_FLAG_NO_UI | Shell32.CMIC.CMIC_MASK_UNICODE | Shell32.CMIC.CMIC_MASK_ASYNCOK,
                                                cbSize = Convert.ToUInt32(Marshal.SizeOf(typeof(Shell32.CMINVOKECOMMANDINFOEX)))
                                            };

                                            if (ContextObject.InvokeCommand(VerbInvokeCommand).Succeeded)
                                            {
                                                return true;
                                            }
                                        }
                                    }

                                    using (SafeResourceId ResSID = new SafeResourceId(Id))
                                    {
                                        Shell32.CMINVOKECOMMANDINFOEX IdInvokeCommand = new Shell32.CMINVOKECOMMANDINFOEX
                                        {
                                            lpVerb = ResSID,
                                            nShow = ShowWindowCommand.SW_SHOWNORMAL,
                                            fMask = Shell32.CMIC.CMIC_MASK_FLAG_NO_UI | Shell32.CMIC.CMIC_MASK_ASYNCOK,
                                            cbSize = Convert.ToUInt32(Marshal.SizeOf(typeof(Shell32.CMINVOKECOMMANDINFOEX)))
                                        };

                                        return ContextObject.InvokeCommand(IdInvokeCommand).Succeeded;
                                    }
                                }
                                else
                                {
                                    return false;
                                }
                            }
                        }
                        else
                        {
                            return false;
                        }
                    }
                    catch (Exception ex)
                    {
                        LogTracer.Log(ex, "Exception was threw when invoke the context menu item");
                        return false;
                    }
                }));
            }
            else
            {
                return(Task.FromResult(false));
            }
        }
Esempio n. 13
0
        public static Task <bool> InvokeVerbAsync(string Path, string Verb, int Id)
        {
            return(Helper.CreateSTATask(() =>
            {
                try
                {
                    if (File.Exists(Path) || Directory.Exists(Path))
                    {
                        using (ShellItem Item = ShellItem.Open(Path))
                        {
                            Shell32.IContextMenu ContextObject = Item.GetHandler <Shell32.IContextMenu>(Shell32.BHID.BHID_SFUIObject);

                            using (User32.SafeHMENU Menu = User32.CreatePopupMenu())
                            {
                                ContextObject.QueryContextMenu(Menu, 0, 0, int.MaxValue, (IsLastExtendedMenuRequested ? Shell32.CMF.CMF_EXTENDEDVERBS : Shell32.CMF.CMF_NORMAL) | Shell32.CMF.CMF_SYNCCASCADEMENU).ThrowIfFailed();

                                if (string.IsNullOrEmpty(Verb))
                                {
                                    using (SafeResourceId ResSID = new SafeResourceId(Id))
                                    {
                                        Shell32.CMINVOKECOMMANDINFOEX IdInvokeCommand = new Shell32.CMINVOKECOMMANDINFOEX
                                        {
                                            lpVerb = ResSID,
                                            nShow = ShowWindowCommand.SW_SHOWNORMAL,
                                            fMask = Shell32.CMIC.CMIC_MASK_FLAG_NO_UI,
                                            cbSize = Convert.ToUInt32(Marshal.SizeOf(typeof(Shell32.CMINVOKECOMMANDINFOEX)))
                                        };

                                        return ContextObject.InvokeCommand(IdInvokeCommand).Succeeded;
                                    }
                                }
                                else
                                {
                                    using (SafeResourceId VerbSID = new SafeResourceId(Verb, CharSet.Ansi))
                                    {
                                        Shell32.CMINVOKECOMMANDINFOEX VerbInvokeCommand = new Shell32.CMINVOKECOMMANDINFOEX
                                        {
                                            lpVerb = VerbSID,
                                            lpVerbW = Verb,
                                            nShow = ShowWindowCommand.SW_SHOWNORMAL,
                                            fMask = Shell32.CMIC.CMIC_MASK_FLAG_NO_UI,
                                            cbSize = Convert.ToUInt32(Marshal.SizeOf(typeof(Shell32.CMINVOKECOMMANDINFOEX)))
                                        };

                                        if (ContextObject.InvokeCommand(VerbInvokeCommand).Failed)
                                        {
                                            using (SafeResourceId ResSID = new SafeResourceId(Id))
                                            {
                                                Shell32.CMINVOKECOMMANDINFOEX IdInvokeCommand = new Shell32.CMINVOKECOMMANDINFOEX
                                                {
                                                    lpVerb = ResSID,
                                                    nShow = ShowWindowCommand.SW_SHOWNORMAL,
                                                    fMask = Shell32.CMIC.CMIC_MASK_FLAG_NO_UI,
                                                    cbSize = Convert.ToUInt32(Marshal.SizeOf(typeof(Shell32.CMINVOKECOMMANDINFOEX)))
                                                };

                                                return ContextObject.InvokeCommand(IdInvokeCommand).Succeeded;
                                            }
                                        }
                                        else
                                        {
                                            return true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        return false;
                    }
                }
                catch
                {
                    return false;
                }
            }));
        }