Сообщение обратно из Windows API

Я пытаюсь получать сообщения от QCollector, как описано в руководстве разработчика интерфейса данных QCollector. Процесс состоит из регистрации предопределенных сообщений, поиска окна сервера QCollector и обмена данными через зарегистрированные сообщения.

мой WndProc обратный вызов получает потерянные сообщения, но ни одно из них не распознается как одно из зарегистрированных сообщений. Я прохожу Form"s this.Handle в запросе, но я не уверен, если это правильно.

Что я делаю неправильно?

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace HistDataManager
{

    public partial class Form1 : Form
    {
        [DllImport("user32.dll", EntryPoint = "FindWindow")]
        private static extern int FindWindow(string sClass, string sWindow);

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern uint RegisterWindowMessage(string lpString);

        [DllImport("user32.dll")]
        static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, UIntPtr wParam, IntPtr lParam);

        int nWinHandle = FindWindow("QCDataInterfaceWndClass", null);

        uint wm_QCollectorClientDataRequest = RegisterWindowMessage("QCOLLECTOR_CLIENT_DATA_REQUEST");
        uint wm_QCollectorClientPortfolioListRequest = RegisterWindowMessage("QCOLLECTOR_CLIENT_PORTFOLIO_LIST_REQUEST");
        uint wm_QCollectorPortfolioListRequestComplete = RegisterWindowMessage("QCOLLECTOR_PORTFOLIO_LIST_REQUEST_COMPLETE ");

        public void TestQC()
        {
            SendMessage(new IntPtr(nWinHandle), wm_QCollectorClientPortfolioListRequest, UIntPtr.Zero, this.Handle);

        }

        protected override void WndProc(ref Message m)
        {
            Console.WriteLine(m.HWnd + "," + m.Msg + "," + m.LParam + "," + m.WParam);
            base.WndProc(ref m);

            if (m.Msg == wm_QCollectorClientPortfolioListRequest || m.Msg == wm_QCollectorPortfolioListRequestComplete)
            {
                Console.WriteLine("Message from specified application found!");
            }

        }

    }
}

РЕДАКТИРОВАТЬ 1:

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

НО я никогда не получаю ответ от qCollector. Кто-нибудь имеет опыт использования этого на любом другом языке, возможно? Я подозреваю, что qCollector был написан на C++.

1 ответ

Я не знаю, нормально ли это в.Net, но я хотел бы предложить вам вызвать все функции либо в конструкторе, либо в функции init().

Предлагаемый дизайн

int nWinHandle=0;
uint wm_QCollectorClientDataRequest=0;
uint wm_QCollectorClientPortfolioListRequest=0;
uint wm_QCollectorPortfolioListRequestComplete=0;

void init()
{
    nWinHandle = FindWindow("QCDataInterfaceWndClass", null);
    wm_QCollectorClientDataRequest = RegisterWindowMessage("QCOLLECTOR_CLIENT_DATA_REQUEST");
    wm_QCollectorClientPortfolioListRequest = RegisterWindowMessage("QCOLLECTOR_CLIENT_PORTFOLIO_LIST_REQUEST");
    wm_QCollectorPortfolioListRequestComplete = RegisterWindowMessage("QCOLLECTOR_PORTFOLIO_LIST_REQUEST_COMPLETE ");
}
Другие вопросы по тегам