小弟最近在编程中想从编译好的dll中调用一个函数,此dll是用c++语言写好编译而成,此函数创建了一个线程专门监视串口输出,如果有就送出一个字符串,但我在c#中不会用事件对其捕捉。下面把c++的函数给出,希望大家能帮助结决如何从c#中捕获此消息而后对此消息进行处理。
  函数如下:
bool StartMonitor(HANDLE hComm, HWND hOwner)
{
DWORD  dwThreadId;
CommInfo.hComm = hComm;
CommInfo.hOwner = hOwner; hThread = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, ThreadProc, &CommInfo, 0, &dwThreadId);
if (hThread == NULL)
return false; return true;
}
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
COMMINFO  *pCommInfo;
DWORD Bytes = 0;
DWORD   BytesToRead = 0;
DWORD ErrorFlags = 0;
char CnfMsg[MAX_BUF_SIZE] = "\0";
char szReadBuf[MAX_BUF_SIZE] = "\0";
DWORD   dwEvtMask = 0;
DWORD   dwSignal = 0;

pCommInfo = (COMMINFO *)lpParameter;
//清除串口缓冲区
PurgeComm(pCommInfo->hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);

//哪些串口事件需要监视
SetCommMask(pCommInfo->hComm, EV_ERR | EV_RLSD | EV_RING | EV_RXCHAR | EV_TXEMPTY);
        while (1) {
WaitCommEvent(pCommInfo->hComm, &dwEvtMask, &Overlapped);
    dwSignal = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE);     if (dwSignal == WAIT_OBJECT_0) {
        if((dwEvtMask & EV_RXCHAR) == EV_RXCHAR) { 
Sleep(100);
RecvChar(pCommInfo->hComm);
if (strlen(RecvBuf) != 0) { strupr(RecvBuf);#ifdef    SMS_DLL_DEBUG
sprintf(RecvDebugInfo, "<-- %s", RecvBuf);
if (strncmp(RecvBuf, "ATWITS", 6))
PostMessage(pCommInfo->hOwner, WM_RECVDATA, 1, (LPARAM)&RecvDebugInfo);
else 
if (DispFlag)
PostMessage(pCommInfo->hOwner, WM_RECVDATA, 1, (LPARAM)&RecvDebugInfo);
#endif if (!strncmp(RecvBuf, "ATWITS+CMTI:1", 13)) {
if (pCommInfo->hOwner != NULL)
PostMessage(pCommInfo->hOwner, WM_RECVSMS, 0, 0);
}
// else if (!strncmp(RecvBuf, "ATWITS", 6)) {
// if (pCommInfo->hOwner != NULL)
// PostMessage(pCommInfo->hOwner, WM_POWERON, 0, 0);
// }
else if (strlen(RecvBuf) != 0) {
//增加临界区控制
memset(RetInfo, 0, MAX_BUF_SIZE);
strcpy(RetInfo, RecvBuf);
SetEvent(hRecvEvent);
}

memset(RecvBuf, 0, MAX_BUF_SIZE);
}
} ResetEvent(Overlapped.hEvent);
}
else if(dwSignal == WAIT_OBJECT_0 + 1) {
SendChar(pCommInfo->hComm);
}
} return 0;
}就是如上代码,想在c#中调用StartMonitor函数来对串口监视如果有PostMessage(pCommInfo->hOwner, WM_RECVSMS, 0, 0);就对其处理。希望大家不吝指教。

解决方案 »

  1.   

    把C#的from 的 Handle传入StartMonitor(HANDLE hComm, HWND hOwner)
    的hOwner , 然后再from的wndproc截获
    类似
    .... wndproc( ref message m )
    {
      if( m.msg == ... .)
    }
      

  2.   

    请你能给我介绍的稍微详细点行吗?hdt(倦怠) 
    我这里的HANDLE hComm 实际上是一个可用的串口,就是后面的Hwnd hOwner不知到怎么用,麻烦您能给的稍微详细点的说明吗?
      

  3.   

    Hwnd hOwner 是接受消息的windows窗口句柄,你要先取得C#里面接受这个消息的窗口句柄
    ,调用StartMonitor。并且要重载这个接受消息窗口的WndProc 方法,类似: // Override the default WndProc behavior to examine messages.
     protected override void WndProc(ref Message msg)
     {
      switch(msg.Msg)
      {
       // If message is of interest, invoke the method on the form that
       // functions as a callback to perform actions in response to the message.
       case WM_CUSTOMMSG:
        this.msgform.RespondToMessage((int)msg.WParam, (int)msg.LParam);
        break;
      }
      // Call the base WndProc method
      // to process any messages not handled.
      base.WndProc(ref msg);
     }

      

  4.   

    问题已经解决,谢谢同志们的帮助,散分结贴了。
    正如(高级伴读书童) (倦怠) 的介绍用c#中的this.handle赋值给howner就能够利用重载winpro函数进行消息的捕获,真心的感谢大家。