2017-05-29 12 views
-1

基本的には、C#MP3プレーヤーを実行していて、曲を変更するか、コマンドラインから一部の関数を呼び出したいとします。別のC#アプリケーションからのC#アプリケーションの呼び出しメソッド

MP3プレーヤーの名前がmp3.exeであると仮定して、アプリケーション自体がまだ動作している間に、その曲をアプリ外から変更したいとします。だから私は考えていた、mp3call.exeと呼ばれる別のアプリを作るので、私は

mp3call -play "<song_here>" 

mp3call.exeが、その後Play(<song_here>)のように、mp3の中から、いくつかの方法Playを呼び出します実行することができます。

これは管理しやすいですか?そしてもしそうなら、どうですか?

+0

https://msdn.microsoft.com/en-us/library/aa730857(v=vs.80).aspx –

+0

hmmmあなたはアプリケーションに引数を渡したり、いくつかのメカニズムを使って2つのアプリケーション間でメッセージングを構築したり、公開したりすることができます共有ライブラリとしてのアプリケーションからのAPI ... – niceman

+0

@HansPassantあなたのリンクは古い – niceman

答えて

-1

興味深いので、私はトピックについて少し研究しました。私はあなたがWin32を使用してこれを行うことができると思います。非常に簡単なサンプルを作成しました。 2つのWPFアプリケーション(最初はWpfSender、2番目の名前はWpfListener)。 WpfSenderはWpfListenerプロセスにメッセージを送信します。

WpfSenderには、クリックされたメッセージを送信するボタンが1つしかありません。 WpfListenerは、WpfSenderからメッセージを受信するとメッセージボックスを表示する空のウィンドウです。ここで

enter image description here

コードは、あなたがここにWindowsアプリケーション間でメッセージ

を送信するためのWin32 APIを使用しWpfSender

using System; 
using System.Diagnostics; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Windows; 


namespace WpfSender 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
     { 
      var process = Process.GetProcessesByName("WpfListener").FirstOrDefault(); 
      if (process == null) 
      { 
       MessageBox.Show("Listener not running"); 
      } 
      else 
      { 
       SendMessage(process.MainWindowHandle, RF_TESTMESSAGE, IntPtr.Zero, IntPtr.Zero); 
      } 
     } 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr SendMessage(IntPtr hwnd, uint Msg, IntPtr wParam, IntPtr lParam); 

     private const int RF_TESTMESSAGE = 0xA123; 
    } 
} 

のための背後にあるWpfListener

using System; 
using System.Windows; 
using System.Windows.Interop; 


namespace WpfListener 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void MainWindow_OnLoaded(object sender, RoutedEventArgs e) 
     { 
      HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle); 
      source.AddHook(WndProc); 
     } 

     private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
     { 

      if (msg == RF_TESTMESSAGE) 
      { 
       MessageBox.Show("I receive a msg here a I can call the method"); 
       handled = true; 
      } 
      return IntPtr.Zero; 
     } 

     private const int RF_TESTMESSAGE = 0xA123; 
    } 
} 

のコードです私はXAMLを書いていないので、それはverです簡単です。繰り返しますが、これは、アプリケーション間のメッセージ送信を実現する方法を示す簡単なサンプルです。限界はあなたの想像力です。それぞれのアクションを表す多くのint定数を宣言し、switchステートメント内で選択されたアクションを呼び出すことができます。

私は私が私の研究で見つかった2件の記事に従うことを言っている:この情報がお役に立てば幸い

For knowing how to handle WndProc in Wpf

For knowing how to send messages using win32 api

を!

+0

投票結果が否定的な場合は、コメントを残して回答を改善してください – taquion

関連する問題