没办法了,发了N多贴子,等了几个月都没有一个好办法解决,最好刺激一下CSDN里的高手吧。
我的问题是这样:
通过打开方式打开指定的文件,又能控制用户在打开方式里选择程序的关闭等进程操作。
在C#里想给程序指定一个文件名,比如1.txt 或1.doc 当用户执行一个操作时会弹出一个“打开方式”对话框,让用户可以选择一个系统内的程序来打开这个文件,目前我想到两种方式,一种是自己写一个与Windows打开方式一样的窗口,通过查找注册表来显示系统里安装的程序(问题是从注册表里查出来的程序列表和Windows里的内容不一样,名称,路径,图标都是问题)。另一种是调用rundll32 指定文件名来打开这个文件,因为调用windows的“打开方式”内容一样(只是当用户双击一个程序的时候C#代码就和这个程序断开联系了,因为不能得到rundll32的返回参数,也不知道用户到底选择用哪个程序打开我们指定的文件,也不能通过Process p=Process.Start("rundll32.exe",  "shell32,OpenAs_RunDLL 1.txt");  中的p来操作这个应用程序的线程,因为p对应的是rundll32 用户选择程序后rundll32就会自动关闭)。
这个问题困扰很多了,一直没有一个好的方案来解决这个问题(前题是我很菜,因为JAVA写这个代码的没有解决所以才学的C#)。
请高手帮帮忙吧,提提建议自己再憋也成。:)

解决方案 »

  1.   

    void CALLBACK OpenAs_RunDLL(HWND hwnd, HINSTANCE hinst, LPCSTR lpszCmdLine, int nCmdShow)
    函数声明是这样的,它根本没有返回值
    如果要弄的话,建议你别用C#,用C++或者Delphi,Hook住shell32.dll中的ShellExecuteExW,记住,只能用inline Hook,可以用lpExecInfo.hProcess获取进程句柄。
      

  2.   

    加分吧,你告诉我你需要什么信息,我写个dll给你在C#中调用
      

  3.   

    既然都是Windows现成能够实现的功能无非是一些拼接 但是技术深度的确不低 而且又是操作系统底层接口调用的问题,我觉得能人肯定有建议楼主给分没有用,把这个问题拿出来向专家提问吧,专门问排行第一第二有荣誉的 看看他们如何解决这个问题
      

  4.   

    我Hook了ShellExecuteExW
    只得到这些数据,楼主你看需要些什么吧:
        cbSize: DWORD;
        fMask: ULONG;
        Wnd: HWND;
        lpVerb: PWideChar;
        lpFile: PWideChar;
        lpParameters: PWideChar;
        lpDirectory: PWideChar;
        nShow: Integer;
        hInstApp: HINST;
        { Optional fields }
        lpIDList: Pointer;
        lpClass: PWideChar;
        hkeyClass: HKEY;
        dwHotKey: DWORD;
        hIcon: THandle;
        hProcess: THandle;
      

  5.   

    Hook可以作,
    楼主真实的目的好像不止于此..
      

  6.   

    不知道lz是不是想这个?Calling the Open With dialog box from your application, using C#
    调用windows文件打开方式对话框
    http://www.codeproject.com/KB/shell/openwith.aspx
      

  7.   

    Calling the Open With dialog box from your application, using C# 
    调用windows文件打开方式对话框 
    http://www.codeproject.com/KB/shell/openwith.aspx
    应该是的,我看就像是
      

  8.   


    我看了,因为没有返回值,好像和Process.start("rundll32.......")实现的功能一样