2010-09-25 28 views
12

Tôi đang làm cho một người tải lên hình ảnh (tải lên hình ảnh để trang web lưu trữ hình ảnh) và tôi đang gặp một số vấn đề qua một cuộc tranh cãi (vị trí hình ảnh đến một ứng dụng đang chạy)luận Pass để chạy ứng dụng

  • Trước hết giả sử MyApp.exe luôn chạy
  • Bất cứ khi nào tôi nhấp chuột phải vào hình ảnh, tôi đã thêm một mục vào menu ngữ cảnh cửa sổ mặc định có nội dung "Tải lên hình ảnh".
  • Khi được nhấp, nó cần phải chuyển vị trí đến ứng dụng đã chạy.

program.cs của tôi:

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()); 
     } 
    } 
} 

Lưu ý rằng lớp ControlPanel không có một hình thức có thể nhìn thấy, chỉ có một biểu tượng trên khay có mặt từ một hình thức là không cần thiết.

Tôi có thể nhận được bất kỳ trợ giúp nào về cách thực hiện việc này không?

Trả lời

13

Tôi đã tìm ra, cảm ơn tuyệt vời cho người đã đăng liên kết http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/a5bcfc8a-bf69-4bbc-923d-f30f9ecf5f64, đây chính xác là những gì tôi đang tìm kiếm!

Dưới đây là một giải pháp đầy đủ:

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()); 
     } 
    } 
} 

Cảm ơn rất nhiều tất cả, và đặc biệt là người đăng liên kết tôi đã đề cập ở trên nhưng tôi đoán ông bị xóa câu trả lời của mình?

Kính trọng, Kenny

+0

Kenny, cảm ơn bài đăng. Nó đã giúp tôi rất nhiều. Có anyway để tham khảo các hình thức (ControlPanel của bạn) trong phương pháp NewInstanceHandler? Tôi biết bạn đang tham khảo các phương pháp "uploadImage" trong ControlPanel nhưng đó là một phương pháp tĩnh. Nhưng tôi cần tham khảo các phương pháp không tĩnh. Xin vui lòng cho tôi biết – Dave

2

Giả sử bạn có quyền kiểm soát môi trường thực thi, ứng dụng nghe có thể chỉ hiển thị điểm cuối bằng WCF hoặc thậm chí là ổ cắm TCP thô. Bằng cách đó, bất kỳ ứng dụng nào khác có thể kết nối với nó theo kiểu động nhưng có cấu trúc.

Mặc dù cả người gửi và người nhận đều trên cùng một máy, sử dụng giải pháp truyền tải mạng (như WCF hoặc TCP) là cách tuyệt vời để gửi dữ liệu an toàn qua các quy trình.

Dưới đây là một ví dụ về làm thế nào để làm điều đó trong TCP với C#: http://www.switchonthecode.com/tutorials/csharp-tutorial-simple-threaded-tcp-server

WCF có thể phức tạp hơn một chút (một phần do nó linh hoạt, và cũng có thể do những hạn chế serialization) nhưng có rất nhiều tài liệu hướng dẫn trực tuyến về cách sử dụng nó. WCFis là một giải pháp hướng đối tượng hơn vì các lớp proxy có thể được tạo ra cho phép bạn thực hiện các cuộc gọi được đánh máy mạnh mẽ đến các đối tượng thực tế, so với việc chỉ gửi các tin nhắn.

4

Bạn sẽ phải thiết lập kênh liên lạc cho các ứng dụng khác để đăng hình ảnh lên. Kênh giao tiếp này có thể là một trong những điều sau đây - không phải danh sách đầy đủ chỉ là mẫu:

  • Thư mục được ứng dụng và tệp của bạn thêm vào khi được thêm vào thư mục.
  • Cổng nơi các ứng dụng khác có thể gửi thông tin đến.
  • Dịch vụ web tự lưu trữ chấp nhận hình ảnh.
  • Cổng TCP nhận hình ảnh.
  • Một đường ống có tên.
  • ....

Như bạn thấy có một số khả năng. Một trong những quyền cho bạn phụ thuộc vào kịch bản của bạn. Hệ thống tệp là một tùy chọn có thể được triển khai dễ dàng bằng cách sử dụng FileSystemWatcher cho mẫu see here.

Dịch vụ web tự lưu trữ cho thấy dịch vụ web có thể nhận hình ảnh. See here để lấy mẫu.

IMHO, đây là hai tùy chọn dễ nhất. Nhưng ... có nhiều hơn nữa.

Đối với cổng TCP, hãy xem bài đăng của Tim.

+1

+1 cho đề xuất của FileSystemWatcher. Tôi đã sử dụng một người xem trên nhiều ứng dụng với kết quả tuyệt vời. Tôi sẽ không sử dụng nó nếu truyền thông đồng bộ hoặc yêu cầu/đáp ứng mối quan hệ được yêu cầu, nhưng nó không có vẻ như đó là những yêu cầu. –

+0

Xin chào, cảm ơn điều đó đã cho tôi thêm một số ý tưởng nhưng bạn nên biết rằng tôi không có quyền kiểm soát trang web lưu trữ hình ảnh. Tôi chỉ tải lên hình ảnh bằng cách gửi POST và lấy phản hồi (có chứa liên kết của hình ảnh đã tải lên, trên internet) Tôi đã thử ý tưởng TCP nhưng vì lý do nào đó tôi không nghĩ đó là điều tôi cần. Tôi có một ứng dụng hoạt động hoàn toàn tải lên hình ảnh, v.v. Điều duy nhất tôi cần bây giờ là: – Kenny

0

tôi đã thêm một số bổ sung nhỏ để các giải pháp trước đây để tham khảo một setter về hình thức để vượt qua các đối số cho nó.

Vì vậy, trước hết, hãy tạo tham chiếu tĩnh cho phiên bản ban đầu của biểu mẫu (MainForm).

Sau đó, khi gửi các đối số tiếp theo, NewInstanceHandler có thể sử dụng tham chiếu đã lưu vào biểu mẫu để truy cập các phương thức/thuộc tính công khai (trong trường hợp của tôi là setter được gọi là AddItem).

Cách dễ dàng để kiểm tra điều này là thêm thuộc tính công khai vào biểu mẫu của bạn với trình thiết lập để thay đổi thuộc tính văn bản của biểu mẫu (văn bản tiêu đề).

[STAThread] 
    static Form1 MainForm; 

    static void Main(params string[] Arguments) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     MainForm = new Form1(); 
     SingleInstanceApplication.Run(MainForm, NewInstanceHandler); 
    } 

    public static void NewInstanceHandler(object sender, StartupNextInstanceEventArgs e) 
    { 
     MainForm.AddItem = e.CommandLine[1]; 
     e.BringToForeground = false; 
    } 

    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()); 
     } 
    } 
+0

Tên 'MainForm' không tồn tại trong ngữ cảnh hiện tại có gì sai? – ACE

0

Để tránh việc chạy phiên bản thứ hai sau khi chuyển đối số dòng lệnh đến phiên bản hiện tại, tôi đã thêm đoạn mã bên dưới.

static class Program 
{ 
    [STAThread] 

    static void Main(params string[] Arguments) 
    { 
     Form1 MainForm; 
     bool bInstanceFlag; 

     Mutex MyApplicationMutex = new Mutex(true, "MyApp_Mutex", out bInstanceFlag); 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     if (!bInstanceFlag) 
     { 
      MainForm = new Form1(); 
     SingleInstanceApplication.Run(MainForm, NewInstanceHandler); 
    } 
    else 
    { 
     MainForm = new Form1(); 
     SingleInstanceApplication.Run(MainForm, NewInstanceHandler); 
     MainForm.Close(); 
    } 
} 

public static void NewInstanceHandler(object sender, StartupNextInstanceEventArgs e) 
{ 
    MainForm.AddItem = e.CommandLine[1]; 
    e.BringToForeground = false; 
} 

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()); 
    } 
} 
} 
+0

Tên 'MainForm' không tồn tại trong ngữ cảnh hiện tại có vấn đề gì ??? – ACE

Các vấn đề liên quan