Как найти окно сообщения только в C# с помощью FindWindowEx?

Я думаю, что я искал все связанные темы на этой планете, используя китайский и английский, но не могу найти решение.

Я создал одно окно только для сообщений, чтобы получать и обрабатывать данные из WM_COPYDATA, но я не могу найти окно на стороне отправки, ниже приведена демонстрационная версия (WPF of C#):

Получать:

public partial class MainWindow : Window
{
    private readonly IntPtr sourceHandle;
    private const int WM_COPYDATA = 0x004A;

    [StructLayout(LayoutKind.Sequential)]
    public struct CopyDataStruct
    {
        public IntPtr dwData;
        public int cbData;
        [MarshalAs(UnmanagedType.LPStr)]
        public string lpData;
    }

    public MainWindow()
    {
        InitializeComponent();
        sourceHandle = this.CreateMessageOnlyWindow();
        this.btnReceive.Content = sourceHandle;
    }

    private IntPtr CreateMessageOnlyWindow()
    {
        IntPtr HWND_MESSAGE = new IntPtr(-3);
        HwndSourceParameters sourceParam = new HwndSourceParameters() { ParentWindow = HWND_MESSAGE };
        var source = new HwndSource(sourceParam);
        source.AddHook(WndProc);
        return source.Handle;
    }

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam, ref bool handled)
    {
        if (msg == WM_COPYDATA)
        {
            MessageBox.Show(lparam.ToInt32().ToString());
            handled = true;
            return new IntPtr(20);
        }
        return IntPtr.Zero;
    }
}

Послать:

public partial class MainWindow : Window
{
    IntPtr WM_COPYDATA = new IntPtr(0x004A);
    IntPtr HWND_MESSAGE = new IntPtr(-3);

    [DllImport("User32.dll")]
    public static extern IntPtr SendMessage(IntPtr hwnd, IntPtr msg, IntPtr wParam, ref COPYDATASTRUCT IParam);

    [DllImport("User32.dll")]
    public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

    public struct COPYDATASTRUCT
    {
        public IntPtr dwData;
        public int cData;
        [MarshalAs(UnmanagedType.LPStr)]
        public string lpData;
    }

    public MainWindow()
    {
        InitializeComponent();
    }

    private void BtnSend_Click(object sender, RoutedEventArgs e)
    {
        //Here cannot find the target message only window in receiving
        IntPtr WINDOW_HANDLE = FindWindowEx(HWND_MESSAGE, IntPtr.Zero, null, null);

        if (WINDOW_HANDLE != IntPtr.Zero)
        {
            byte[] arr = System.Text.Encoding.Default.GetBytes(txtMessage.Text);
            int len = arr.Length;
            COPYDATASTRUCT cdata;
            cdata.dwData = (IntPtr)100;
            cdata.lpData = txtMessage.Text;
            cdata.cData = len + 1;
            SendMessage(WINDOW_HANDLE, WM_COPYDATA, IntPtr.Zero, ref cdata);
        }
    }
}

Метод BtnSend_Click в Send, не может найти правильный дескриптор окна здесь, может кто-то в этом поддоне может помочь?

PS: сначала я должен описать свое требование: я хочу создать службу Windows на C#, которая является получателем и обрабатывает данные из WM_COPYDATA, поэтому я думаю, что окно только для сообщений необходимо, потому что в службе Windows нет окна.

Поэтому в Sender мне нужно найти это окно только для сообщений, чтобы сначала передать дескриптор окна в SendMessage, вот в чем дело.

Спасибо, парни

0 ответов

Другие вопросы по тегам