2017-09-20 170 views
0

我有一個表示DBF編輯器,允許你有3種方式打開文件的C#/ WPF項目: - 與apposit按鈕在工具欄 - 通過拖放&下降 - 與雙擊文件 現在我用一個TabControl包含每個打開的dbf。 我可以用我的內部按鈕處理它,並將添加項目拖到容器。 如果我用雙擊打開一個文件,並且有一個打開的實例,我想將它添加到容器中,而是打開一個新的實例。 我的代碼:如何用已打開的可執行文件打開文件?

  • 應用

公共部分類應用:應用 {

private static Editor mainWindow = null; 
protected override void OnStartup(StartupEventArgs e) 
{ 
    Editor mainWindow = new Editor(e.Args); 
    mainWindow.Show(); 
} 

}

  • 編輯:

    公共部分類編輯:窗口
    {

      ChooseMessage.Choose choose; 
          public Dictionary<int, DBFStructure> ds; 
          string DbfName; 
          private string[] OldNew; 
          public Editor(string[] e) 
          { 
           InitializeComponent(); 
           ds = new Dictionary<int, DBFStructure>(); 
           OldNew = new string[2]; 
           choose = ChooseMessage.Choose.OK; 
           if (e.Length > 0) 
            if (File.Exists(e[0]) && e[0].EndsWith(".dbf", StringComparison.InvariantCultureIgnoreCase)) 
             EffOpen(e[0]); 
          } 
          private void dbf_Drop(object sender, DragEventArgs e) 
          { 
           if (e.Data.GetDataPresent(DataFormats.FileDrop, true) == true) 
           { 
            string filename = ((string[])e.Data.GetData(DataFormats.FileDrop, true))[0]; 
            if (File.Exists(filename) && filename.EndsWith(".dbf", StringComparison.InvariantCultureIgnoreCase)) 
             EffOpen(filename); 
           } 
          } 
        .... 
        } 
    

我爲代碼顯示抱歉,我不能正確地設置它。

我的問題是攔截從最後一個打開的編輯器實例打開一個dbf並將其添加到controltab,否則創建一個新的實例。

P.S. EffOpen(文件名)表示,通過

由於傳遞FIL名,加載它,並將它添加到容器的所有

+0

Windows中沒有檢測到另一個進程打開文件的機制。畢竟這是一款反惡意軟件產品,這並非完全不可能。但需要使用C#無法完成的操作系統補丁。不應該用任何語言來做,錯誤對用戶的機器是非常不穩定的。 –

回答

0

當您打開通過雙擊文件,一個新的應用程序實例將是方法由Windows啓動。這是設計,你不能改變這一點。

在這個新實例中,您沒有直接引用第一個應用程序實例的對象,因此您不能只將正在打開的文件添加到第一個實例的TabControl

你需要實現它這樣的:

  • ,因爲你可以通過雙擊打開文件,應用程序可以使用命令行參數處理文件 - 這是很好的
  • 你需要一種方法來檢查是否有一個實例已經運行 - 使用具有專用和唯一名稱的Mutex來做到這一點;嘗試創建應用程序啓動時一個Mutex並檢查Mutex(bool, string, out bool)構造的out參數 - 如果它是false,那麼已經有您需要一種方法來告訴已經運行的實例,它需要打開已經有文件的實例
  • 作爲命令行參數傳遞給第二個實例;使用更適合你的inter-proc方法中的任何一種:NamedPipe將是一個非常簡單的方法