我正在使用WindowsAPICodePack,获取ShellFile的缩略图.但是其中一些看起来像通用图标 - 具有黑色背景.因此,我将其设为Bitmap并将Black设置为透明.
问题是,当它是图片的缩略图时 - 它不应该这样做.如何从"图标"中分辨出真实的缩略图?
我的代码:
ShellFile sf = ShellFile.FromFilePath(path);
Bitmap bm = sf.Thumbnail.MediumBitmap;
bm.MakeTransparent(Color.Black);
Run Code Online (Sandbox Code Playgroud)
谢谢
我正在编写一个应用程序,并希望使用该TaskDialogIndirect函数 - 但是我不想写大量的P/Invoke等等,所以我已经包含了WinAPICodePack.但是有一个问题!当我为TaskDialog它创建一个控件并将其添加到对话框时,一切正常.但是,运行Show方法会导致OverflowExceptionmscorlib.我将其跟踪到一些指针处理和编组.
尝试使用代码得到了结果,我发现,必须为.NET 3.5和包含应用程序TOO编译DLL .在.NET 4.0上安装我的应用程序会调用此错误...有关解决方法的任何想法 - 或者您甚至可以重现此错误?
另一个问题是我可以将Icon属性设置为我想要的,但图标根本不显示.我必须设置一个Opened动态设置图标的事件......
信息:在Windows 8 Pro x64 RTM上运行Visual Studio 2012 RTM.应用程序是标准的WPF应用程序.
示例代码:
TaskDialog td = new TaskDialog();
td.Cancelable = true;
td.Caption = "Caption";
td.InstructionText = "Instructions";
td.Text = "Text";
TaskDialogCommandLink buttonElevation =
new TaskDialogCommandLink("elevation", "Elevation Required Sample");
buttonElevation.UseElevationIcon = true;
td.Controls.Add(buttonElevation);
td.Show(); // OverflowException occurs here!
Run Code Online (Sandbox Code Playgroud) .net winapi marshalling overflowexception windows-api-code-pack
我正在开发现代WPF应用程序。我想使用TaskDialog,但总是会遇到常见错误:
TaskDialog功能需要加载comctl32.dll的版本6,但是当前正在内存中加载了其他版本。
我试图添加一个清单(已经包含正确的comctl32.dll所需的依赖项),并将其设置为项目属性中的默认清单。
它仍然抛出此异常:-/
我的应用程序是这样构建的:它是一个启动应用程序(正常的Windows应用程序,非wpf)。它仅具有“ Program.cs”,这是入口点。它在那里动态地加载实际的应用程序(它是一个库,而不是WPF应用程序项目)。它调用启动方法来启动应用程序。
效果很好,但是我总是会遇到这个异常。我猜这是因为有这个启动系统...但是解决该问题的可能解决方法是什么?
非常感谢 :)
[R
我想知道是否可以使用Windows API代码包来设置/编辑文件扩展属性(资源管理器:右键单击>属性>详细信息)。
var shellFile = Microsoft.WindowsAPICodePack.Shell.ShellObject.FromParsingName(filePath);
var artistName = shellFile.Properties.GetProperty(SystemProperties.System.Music.DisplayArtist).ValueAsObject.ToString();
var duration = TimeSpan.FromMilliseconds(Convert.ToDouble(shellFile.Properties.GetProperty(SystemProperties.System.Media.Duration).ValueAsObject) * 0.0001);
Run Code Online (Sandbox Code Playgroud)
我使用以下几行来获取所需的属性,但是我不知道如何编辑其中之一(例如艺术家名称)。我知道我可以使用taglib-sharp,但是只有在没有外部代码的情况下没有解决方案时,我才会使用它。
谢谢大家花时间帮助我。
我在VBA/VB6中使用了windows函数ReadProcessMemory,我不明白为什么当我更改ByVal的传递机制时lpBuffer,该函数仍然会修改通过此参数传递的原始对象的值.在文档中,此参数被指定为应通过引用传递的输出.不应该通过值更改传递机制来防止原始实例被修改?为什么不呢?
Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any _
,byVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Run Code Online (Sandbox Code Playgroud)

使用先前堆栈溢出问题中的代码:
System.Drawing.Bitmap image;
ShellFile f = ShellFile.FromFilePath(fileLocation);
image = f.Thumbnail.ExtraLargeBitmap;
image.Save(tempfile, ImageFormat.Png);
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用Window API来获取PDF的缩略图
我被认为可以生成类似于PDF文档第一页的图像文件。
但是实际情况是,它看起来并不像PDF图标。
在实际按预期工作之前,我是否需要缺少任何内容?
PDF文件已与Adobe Reader正确关联。
在Windows资源管理器中浏览目录时,我确实会看到与文档关联的缩略图。
我应该注意,在处理Excel和Word文档时,该代码实际上确实可以正确提取缩略图。
编辑(参考):
我想将InitialDirectorya的属性设置WindowsAPICodePack CommonOpenFileDialog为我的计算机位置,我使用等效的CLSID或GUID或这到底是什么,只是我想知道是否存在更本地/安全的方法来正确设置我的计算机位置,我试过这个,但没有奏效:
.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer)
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的代码:
Dim FolderPicker As New Microsoft.WindowsAPICodePack.Dialogs.CommonOpenFileDialog
With FolderPicker
.IsFolderPicker = True
.Title = "Folder Dialog Test"
.InitialDirectory = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" ' My Computer
.DefaultFileName = "C:\"
End With
Run Code Online (Sandbox Code Playgroud)
更新:
我在 Windows 8 x64 上。
其他特殊文件夹(例如库和桌面)的工作方式如下:
.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
Run Code Online (Sandbox Code Playgroud) 我找不到的名称空间ShellFile。
我已经添加using System.Windows.Shell并尝试通过程序包管理器控制台加载Windows7APICodePack:
PM>安装包Windows7APICodePack
安装“ Windows7APICodePack 1.0.0.0”。
您正在从Microsoft下载Windows7APICodePack,可以从http://code.msdn.microsoft.com/WindowsAPICodePack/Project/License.aspx获得许可协议。检查程序包是否有其他依赖性,这些依赖性可能与它们自己的许可协议一起提供。您使用软件包和依存关系即表示您接受其许可协议。如果您不接受许可协议,请从设备中删除相关组件。
已成功安装“ Windows7APICodePack 1.0.0.0”。
将“ Windows7APICodePack 1.0.0.0”添加到CADBuilderGUI。
已将“ Windows7APICodePack 1.0.0.0”成功添加到CADBuilderGUI。
我只是尝试使用以下命令安装更高版本的1.1.0.0:
PM> Install-Package Windows7APICodePack-Shell
Run Code Online (Sandbox Code Playgroud)
但仍然没有运气。
我只是想通过以下方式获取文件的缩略图:
ShellFile shellFile = ShellFile.FromFilePath(files[0]);
Bitmap shellThumb = shellFile.Thumbnail.ExtraLargeBitmap;
Run Code Online (Sandbox Code Playgroud)
但是它不知道是什么ShellFile。
有什么建议么?
这不是重复的,因为PresentationFramework.dll是通过引用添加的,并且我正在Framework 4.0中进行构建。
使用 WindowsAPICodePack 在 Win8/64 位上执行一些资源管理器/shell 操作。使用 x64 平台目标迭代文件属性时,属性系统存在一些问题,导致 AccessViolationException。PropVariant.cs 似乎存在一些问题。切换到 x86 可以解决问题,但会导致目录列表不完整(system32/drivers 中缺少 fe“etc”)。有任何想法吗?
using System;
using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack.Shell.PropertySystem;
namespace ApiCodepackTest
{
class Program
{
const string path = @"c:\windows\system32\drivers";
static void Main(string[] args)
{
var shellObject = (ShellFolder)ShellObject.FromParsingName(path);
showProperties(shellObject);
showItems(shellObject);
Console.ReadLine();
}
static void showProperties(ShellFolder folder)
{
var sys = folder.Properties.System;
foreach (var prop in sys.GetType().GetProperties())
{
try
{
var shellProperty = prop.GetValue(sys) as IShellProperty;
if (shellProperty != null && shellProperty.ValueAsObject != null)
Console.WriteLine(shellProperty.CanonicalName + " " + …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 CommonOpenFileDialog 的文件夹选择器,如本答案中所述。问题是,即使有一个非常精简的示例项目,我在尝试使用 CommonOpenFileDialog 的函数时也会遇到异常ShowDialog()。
using Microsoft.WindowsAPICodePack.Dialogs;
namespace DialogTest
{
class Program
{
public static void Main(string[] args)
{
CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.InitialDirectory = "C:\\Users";
dialog.IsFolderPicker = true;
CommonFileDialogResult result = dialog.ShowDialog();
if (result == CommonFileDialogResult.Ok)
{
//Do Stuff
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我还与作者 Microsoft 一起使用以下 nuget 包:
此代码在 处产生以下异常dialog.ShowDialog();:
System.Runtime.InteropServices.COMException was unhandled
ErrorCode=-2147023116
HResult=-2147023116
Message=A null reference pointer was passed to the stub. (Exception from HRESULT: …Run Code Online (Sandbox Code Playgroud) c# ×6
.net ×2
winforms ×2
wpf ×2
dialog ×1
marshalling ×1
pdf ×1
taskdialog ×1
thumbnails ×1
vb.net ×1
vb6 ×1
vba ×1
winapi ×1