2017-02-15 4 views
9

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

Мой ответ WndProc получает потерянные сообщения, но ни одно из них не распознается как одно из зарегистрированных сообщений. Я прохожу Formthis.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!"); 
      } 

     } 

    } 
} 

EDIT 1:

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

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

+0

Что вы имеете в виду _TargetApp_? –

+0

Вместо этого используйте PostMessage. –

+0

@JoshuaDrake TargetApp - это wnd, который я нахожу в FindWindow («QCDataInterfaceWndClass», null) – ManInMoon

ответ

-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 "); 
} 
+0

Вопрос не в следующем: «Как мне улучшить свой дизайн?«Вопрос заключается в следующем:« Как получить значение, возвращаемое в сообщении через процессы? »Этот предлагаемый ответ не затрагивает вопрос. Даже не удаленно, и он не добавляет ничего полезного в противном случае. – IInspectable

Смежные вопросы