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); }
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)); }
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)); }
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); }
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); }
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)); } }
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)); }
/// <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); }
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()); }
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()); }
public IList <ResourceId> GetResourceNames(SafeResourceId type) => EnumResourceNamesEx(hLib, type);
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)); } }
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; } })); }