本人做一个程序,已在程序中利用注册表给系统右键菜单中增加了一项"发送到网盘",现想给这个选项绑定一个程序上的事件函数,不知道可否这样做?当然程序关闭时这个选项也会用注册表删除.请各高手指教,小弟将非常感激,谢谢~RegistryKey reg;
reg = Registry.ClassesRoot;
reg=reg.CreateSubKey(@"*\shell\myApp");
//创建新项myApp
reg.SetValue("","发送到网盘");
//设置项值
reg = Registry.ClassesRoot;
reg.CreateSubKey(@"*\shell\myApp\command");
//创建新项command
reg.SetValue("",Application.ExecutablePath+" %1");   //现只能给它执行一个程序了,想要让它触发程序中的一个事件
//设置command的值
reg.Close();

解决方案 »

  1.   

    我想,有2个方法可以提供给你:
    1.指向另外一个程序,那个程序启动,收到参数后。查找你主程序并发送自定义消息,WPARAM传递一个字符串。你的主程序响应消息。就可以了。
    2.还是启动主程序,但启动起来后,检查是否有其他实例运行了。如果有,同样的作为自定义消息,发送给主程序的另一个实例。
      

  2.   


    class Program
    {
      static void Main(string[] argv)
      {
         if(argv.Length > 0 )
         {   
           string filename = argv[0];   // argv[0] == "%1" == the file name you right clicked
           CopyToMyDrive( filename );
         }
         else
         {
             RegisterContextMenu();
             Console.Read();            // press enter to unregister and exit.
             UnRegisterContextMenu();
         }
      }
      static void CopyToMyDrive( string filename )
      {
         // todo
      }
    }
      

  3.   

    一楼二楼的方法很好,都可以采纳,不过我想问:
    当前程序(WinForm形式的)正在运行的时候,argv值获得了,可是我应该怎么让当前的程序窗体(Application.Run(new ShareFile());)激发,并执行窗体ShareFile的事件呢,如果能够如此,解决也就解决了!请高手再支招~
      

  4.   


    ShareFile sf = new ShareFile();
    sf.SetCopyFileSource( filename );               //<---- for example
    Application.Run( sf );class ShareFile : Form
    {
         public ShareFile()
         {
             InitializeComponent();
             CopyToMyDrive( filename )
         }
         ...
    }
      

  5.   

    楼上的方法那样就会重新建立一个ShareFile实例窗体了,不能激活已运行的ShareFile窗体以及不能调用当前运行窗体中的一些全局参数(发送数据所需),如网盘的IP和端口...
      

  6.   

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;namespace TryFile
    {
        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]        static void Main(string[] argv)
            {
                Controls.ClassForms forms = new TryFile.Controls.ClassForms();
                Boolean createdNew; //返回是否赋予了使用线程的互斥体初始所属权
                System.Threading.Mutex instance = new System.Threading.Mutex(true, "MutexName", out createdNew); //同步基元变量
            
                if (createdNew) //赋予了线程初始所属权,也就是首次使用互斥体
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);                
                    Application.Run(new ShareFile());
                    instance.ReleaseMutex();                
                }
                else
                { 
                    string filename = null;
                    string username = null;
                    string str=null;
                    if (argv.Length > 1)
                    {
                        filename = argv[0];       //从右键菜单获得的文件名路径
                        username = argv[1];       //网络发送的用户名,如aa;
                        str = "收到信息:" + filename + "和" + username;                    
                    }
                    
                    //测试
                    MessageBox.Show("已经启动了一个程序,请先退出!  " + str, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                //***********************如下为设法找到当前运行窗体,并激活,但forms还不成功
                    foreach (System.Windows.Forms.Form form in forms)
                    {
                        if (form.Text.ToString() == "456")
                        {
                            ShareFile f = (form as ShareFile);
                            f.label1.Text = "OK";
                            f.Activate();
                            return;
                        }
                    }   
               //**************************************************            
                    Application.Exit();
                }            
            }
        }
    }
      

  7.   

    激活当前运行窗体,并调用它的事件,所有问题都将得到解决.
    (第一次运行后,可以在"开始"->"运行" 中输入"E:\TryFile\TryFile\bin\Debug\TryFile.exe mydoc.doc aa)" 进行测试)希望高手再次指点,十分感激~加分~
      

  8.   

    你要的是进程间的通讯。1、用一楼wuyazhe的建议,比如用WM_COPYDATA消息来传递文件名。
    2、用其他通讯机制,像.NET Remoting
    3、还是直接在当前实例处理最方便,注册实例别碰需要的资源就可以了。
      

  9.   

    gomoku 后面那句话说的好,给了一个很大的支持,在此感谢gomoku 和 wuyazhe ;
    问题得到解决,参考:
    C#用WM_COPYDATA消息来实现两个进程之间传递数据
    http://www.iisol.cn/article.asp?id=105
    http://bruce.in/p/324现做一个DLL类注入到explorer.exe进程里,在点击右键菜单时即用DLL进行进程之间的数据传递,从而在主窗体执行CopyToMyDrive(filename,user)操作,哈哈,感谢各位支持,一起探讨,共同进步~