从另一个C#应用程序调用C#应用程序中的方法

时间:2017-05-29 18:00:15

标签: c# .net windows multithreading process

基本上让我说我有一个C#MP3播放器正在运行,我想更改歌曲或只是从命令行调用一些功能。

假设MP3播放器名为mp3.exe,我想在应用程序本身仍在运行时从应用程序外部更改歌曲。所以我在想,制作一个名为mp3call.exe的应用程序,以便我可以运行

mp3call -play "<song_here>"

然后mp3call.exe会在mp3中调用某个方法Play,例如Play(<song_here>)

这可管理吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:-1)

我对这个话题进行了一些研究,因为它似乎很有趣。我认为你可以通过使用Win32来做到这一点。我做了一个非常简单的样本。两个WPF应用程序,首先命名为WpfSender,第二个命名为WpfListener。 WpfSender将向WpfListener进程发送消息。

WpfSender只有一个按钮,一旦点击它就会发送消息。 WpfListener只是一个空窗口,在收到来自WpfSender的消息时会显示一个消息框。

enter image description here

以下是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;
    }
}

使用Win32 api跨Windows应用程序发送消息

以下是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,因为它非常简单。同样,这是一个非常简单的示例,向您展示如何实现跨应用程序消息发送。限制是你的想象力。你可以声明许多int常量,每个常量代表一个动作,然后在switch语句中你可以调用所选动作。

我不得不说我跟随我在研究中发现的两篇文章:

For knowing how to handle WndProc in Wpf

For knowing how to send messages using win32 api

希望这有帮助!