使用默认应用程序打开文件的最简单方法是:
System.Diagnostics.Process.Start(@"c:\myPDF.pdf");
Run Code Online (Sandbox Code Playgroud)
但是,我想知道是否存在将参数设置为默认应用程序的方法,因为我想在确定的页码中打开pdf.
我知道如何创建新进程并设置参数,但是这样我需要指明应用程序的路径,我希望有一个可移植的应用程序而不必设置应用程序的路径每次我在其他计算机上使用该应用程序.我的想法是,我希望计算机已经安装了pdf阅读器,只说明打开了哪个页面.
谢谢.
如何获得基于扩展的常规文件类型描述,就像资源管理器一样?所以不是MIME,而是最终用户看到的信息,比如.
.doc = Microsoft Office Word 97 - 2003文档.zip = ZIP文件.avi =视频文件.
我怎样才能获得似乎可用的"辅助"信息,我猜它不是基于扩展的.就像"视频文件"一样,它可以为您提供电影的"长度"或文档文件,它有多少页面等等.
有时需要让您的应用程序打开文件的默认应用程序.例如,要打开PDF文件,您可以使用:
System.Diagnostics.Process.Start("Filename.pdf");
Run Code Online (Sandbox Code Playgroud)
要打开图像,您只需使用具有不同文件名的相同代码:
System.Diagnostics.Process.Start("Filename.gif");
Run Code Online (Sandbox Code Playgroud)
一些扩展(例如.gif)几乎总是有一个默认的处理程序,即使在基本的Windows安装中也是如此.但是,某些扩展(例如.pdf)通常没有安装应用程序来处理它们.
在这些情况下,在调用Process.Start(fileName)之前,最好确定应用程序是否与要打开的文件的扩展名相关联.
我想知道如何最好地实现这样的事情:
static bool ApplicationAssociated(string extension)
{
var extensionHasAssociatedApplication = false;
var condition = // Determine if there is an application installed that is associated with the provided file extension.;
if (condition)
{
extensionHasAssociatedApplication = true;
}
return extensionHasAssociatedApplication;
}
Run Code Online (Sandbox Code Playgroud) 我试图在Impersonation下使用Process.Start(),我有谷歌几天,我遇到的大多数答案是在ASP.net下,但我正在为Window Application开发,所以我很难找到根本原因.
这是我的冒充代码
private void impersonateValidUser(string userName, string domain, string password)
{
WindowsIdentity tempWindowsIdentity = null;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
if ( LogonUser( userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0)
{
if ( DuplicateToken( token, 2, ref tokenDuplicate ) != 0 )
{
tempWindowsIdentity = new WindowsIdentity( tokenDuplicate );
mImpersonationContext = tempWindowsIdentity.Impersonate();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我试图通过我的程序打开文档(没有.exe,如.txt,.doc)
using (new Impersonator(DomainUserID, Domain, Password))
Process.Start(filePath);
Run Code Online (Sandbox Code Playgroud)
到目前为止,我能够使用模拟用户检测目录/文件,这对我当前的登录用户来说是不可见的,因为我没有授予它访问权限.但每当我尝试打开文档时,我都会收到错误
System.ComponentModel.Win32Exception (0x80004005): Access is denied
Run Code Online (Sandbox Code Playgroud)
如果我错了请纠正我,所以在这种情况下,我不认为将UseShellExecute设置为false(还有用户名和密码输入的processStartInfo?)因为它是可执行文件(?),我确实遇到过使用CreateProcessAsUser函数,这个函数似乎也不适用于我的情况,从我为.exe文件读取它的例子.
如果有人能够启发我,我将不胜感激.
更新:模拟类
public class Impersonator …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下代码从我的 winform 运行 Windows 通用应用程序,但不幸的是它打开了文档文件夹。我是 UWP 应用程序开发的新手。这是启动 UWP 应用程序的正确方法吗?
Process p = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "explorer.exe";
startInfo.Arguments = @"shell:appsFolder\Microsoft.SDKSamples.CameraAdvancedCapture.CS_8wekyb3d8bbwe!App";
p.StartInfo = startInfo;
p.Start();
Run Code Online (Sandbox Code Playgroud) 我试图打开与"TXT"文件关联的编辑器-这里有个致命的,虽然,我的文件实际上不具备的txt扩展,所以我不能随便ShellExecute吧,我一定要找到手动关联的程序.
为此,我一直在尝试使用IApplicationAssociationRegistration::QueryCurrentDefaultShell 的COM方法,但是它返回一个ProgId,这对我来说是无用的.如何将其映射到EXE?我正在使用C#,但似乎并不相关.
编辑:下面链接的方法,您直接访问注册表不再适用于所有情况.正确的方法是上面的,但我需要下一步 - 如何获取返回的ProgId并获取相关的程序?
如何从.net启动任意文件的默认程序?
例如,如果我有一个FileInfo.mp3音乐的引用,我想启动Windows Media Player(如果它被设置为文件类型的默认处理程序)
因此,如果我有.xls,我想在预先打开文件的情况下启动Excel.
我怎么能从代码中做到这一点?