传递参数以运行应用程序

Ken*_*nny 14 c# arguments

我正在制作一个图像上传器(将图像上传到图像托管网站),我遇到了一些问题(图像位置已经运行的应用程序)

  • 首先让我们说MyApp.exe一直在运行
  • 每当我右键单击图像时,我在默认的Windows上下文菜单中添加了一个项目,上面写着"上传图像".
  • 单击它时,需要将该位置传递给已在运行的应用程序.

我的program.cs:

static class Program
{
    [DllImport("user32.dll")]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll")]
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, UIntPtr
    wParam, IntPtr lParam);

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern uint RegisterWindowMessage(string lpString);

    [STAThread]
    static void Main(params string[] Arguments)
    {
        if (Arguments.Length > 0)
        {
    //This means that the the upload item in the context menu is clicked
    //Here the method "uploadImage(string location)"
    //of the running application must be ran
        }
        else
        {
    //just start the application
            Application.Run(new ControlPanel());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,ControlPanel类没有可见的表单,只有托盘图标,因为不需要表单.

我能帮忙解决一下这个问题吗?

Ken*_*nny 16

我已经想通了,非常感谢发布http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/a5bcfc8a-bf69-4bbc-923d-f30f9ecf5f64链接的人,这是正是我在寻找的!

这是一个完整的解决方案:

static class Program
{
    [STAThread]
    static void Main(params string[] Arguments)
    {
        SingleInstanceApplication.Run(new ControlPanel(), NewInstanceHandler);
    }

    public static void NewInstanceHandler(object sender, StartupNextInstanceEventArgs e)
    {
        string imageLocation = e.CommandLine[1];
        MessageBox.Show(imageLocation);
        e.BringToForeground = false;
        ControlPanel.uploadImage(imageLocation);
    }

    public class SingleInstanceApplication : WindowsFormsApplicationBase
    {
        private SingleInstanceApplication()
        {
            base.IsSingleInstance = true;
        }

        public static void Run(Form f, StartupNextInstanceEventHandler startupHandler)
        {
            SingleInstanceApplication app = new SingleInstanceApplication();
            app.MainForm = f;
            app.StartupNextInstance += startupHandler;
            app.Run(Environment.GetCommandLineArgs());
        }
    }  
}
Run Code Online (Sandbox Code Playgroud)

非常感谢,特别是发布我上面提到的链接的人,但我猜他删除了他的答案?

问候,肯尼


Axe*_*ger 5

那么您将不得不为其他应用程序建立一个通信渠道来发布图像。此通信渠道可以是以下之一 - 不是完整列表,只是示例:

  • 由您的应用程序监视的目录,一旦将文件添加到目录中,就会添加该文件。
  • 其他应用程序可以向其发送信息的端口。
  • 接受图像的自托管 Web 服务。
  • 接收图像的 TCP 端口。
  • 命名管道。
  • ....

如您所见,有几种可能性。适合您的方案取决于您的方案。文件系统是一个可以使用FileSystemWatcher示例轻松实现的选项,请参见此处

自托管 Web 服务公开可以接收图像的 Web 服务。请参阅此处获取示例。

恕我直言,这是最简单的两个选项。但是……还有几个。

对于 TCP 端口,请参阅 Tim 的帖子。