2011-01-18 6 views
11

"연결 프로그램"파일 대화 상자를 여는 간단한 방법이 있습니까?"파일 열기"대화 상자를 표시하려면 어떻게해야합니까?

+4

Winforms? WPF? Webforms? MVC? – Oded

+0

CodeProject에는 Google을 검색 할 때 최상위 기사 인 http://www.codeproject.com/KB/shell/openwith.aspx가 있습니다. 그러나, 나는 externs (processStartInfo 아마도, 아마도?)에 의지보다는 이것을하는 더 예쁜 방법을보고 싶다. –

+2

http://stackoverflow.com/a/32153874/5306861 – codeDom

답변

9

이 트릭을한다고 ...

오뎃이 좋은 점하게,하지만
var processInfo = new ProcessStartInfo(fileName); 
processInfo.Verb = "openas"; 
Process.Start(processInfo); 

- 당신이 이러한 기능을 사용하려는 경우 방법/정확히 모르는이 귀하의 상황에 대한 해답이 될하지 않을 수 있습니다 의미 .

이 답변에 대한 최근 댓글은 처음에 자세하게 설명하지 않았습니다. 에 해당 파일 형식에 대해 이미 open 동사가 정의되어있는 파일을 만들려고하면 문제가 발생합니다. 마찬가지로 동사가 정의되지 않은 파일 open을 시도하면 문제가 발생합니다. 이 문제는 다음과 같습니다

Win32Exception : 어떤 응용 프로그램이 나는 것을 토마스에게 제안 내 머리 위로 떨어져이 작업

에 대해 지정된 파일과 관련되지 않은에서 이러한 종류의 코드를 사용하기 위해 프로덕션 응용 프로그램을 철저히하고 레지스트리를 확인하거나 주어진 동사로 파일을 열 수 있는지 여부를 알아야합니다. ProcessStartInfo.Verbs을 고려할 때보 다 간단 할 수 있습니다. fileName이 설정되면 파일 형식과 관련된 가능한 동사 모음을 제공합니다. 이렇게하면 어떤 파일을 어떻게 처리해야하는지 쉽게 결정할 수 있습니다.

필자가 토마스에게 언급했듯이 애플리케이션에 약간의 복잡성과 지능을 추가해야 할 필요가 있습니다.이 답변은 확실히 포괄적 인 솔루션이 아닙니다.

+1

작동하지 않습니다 ... Win32Exception, "이 작업에 지정된 파일과 관련된 응용 프로그램이 없습니다" –

+0

@ThomasLevesque '기본 프로그램'이없는 경우에만 작동합니다. 정의된다; 말하자면, 'Open with ...''상황에 맞는 메뉴가 나타나면 실패합니다. 단순히 '열기'옵션이있는 알 수없는 파일 유형이라면이 방법이 효과적입니다. 반대의 경우도 마찬가지입니다. 알려진 파일 유형에 대해 'open'동사를 사용하면 기본 프로그램이 시작되지만 알 수없는 경우이 동일한 예외가 표시됩니다. 그래서, 적절한 응용 프로그램에서 당신은 이것에 대해 철저히하고 싶습니다; 아마도 알려진 파일 유형 repo (레지스트리)에서 조회를 수행하고 시스템에서 제공 한 사실을 열어 보는 방법을 결정할 수 있습니다. –

+0

@ThomasLevesque 실제로 이러한 길이로 갈 필요조차 없습니다 : ['ProcessStartInfo.Verbs'] (http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.verbs (VS.90) .aspx)는'fileName'이 설정되었을 때 파일에 대한 가능한 동사로 채워질 것입니다. 즉'open' 동사가 정의되었는지,'openas'를 사용하지 않는지를 확인할 수 있습니다. 이것은 내가 베팅 한 모든 경우를 포착하지 않으므로 마음대로 자신의 영리함을 추가하십시오. –

-3

에는 shell examples 톤이 있습니다. 어쩌면 예를 들어보고 싶은 기능이 있는지 여부를 확인하기 위해 살펴볼 수 있습니다. 디폴트 프로그램이 표시됩니다 대화와 오픈 정의되지 않은 경우

System.Diagnostics.Process.Start(path); 

파일을 사용하여

18

이 ProcExp 일부 리버스 엔지니어링 근무에서 rundll32.exe 명령 줄을 밝혀 : 당신은에이 기능을 사용하는 예를

[DllImport("shell32.dll", SetLastError = true)] 
extern public static bool 
     ShellExecuteEx(ref ShellExecuteInfo lpExecInfo); 

:

당신은 기능을 사용할 수 있습니다. Win7에에서 테스트

using System; 
using System.Diagnostics; 
using System.IO; 

class Program { 
    static void Main(string[] args) { 
     ShowOpenWithDialog(@"c:\temp\test.txt"); 
    } 
    public static void ShowOpenWithDialog(string path) { 
     var args = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "shell32.dll"); 
     args += ",OpenAs_RunDLL " + path; 
     Process.Start("rundll32.exe", args); 
    } 
} 

, 나는이 다른 버전의 Windows에서 작동 얼마나 잘 추측 할 수 있습니다 : 여기를 사용하는 샘플 프로그램입니다.

+0

@ 한스 감사합니다! 나는 한동안 수풀 주위를 때리고 있었고 이것은 내가 필요로하는 것이다. shell32.dll의 전체 경로를 사용하지 않았습니다. – tehDorf

+0

OpenAs_RunDLL은 문서화되지 않았기 때문에 [항상 작동하지는 않습니다.] (http://stackoverflow.com/questions/23566667/rundll32-shell32-dll) –

관련 문제