关于PostMessage,以及模态非模态窗体
这个是重发的,原来那个沉到底了
代码中,在一个串口监控线程用PostMessage给一个非模态窗口,老是不行,GetLastError=1440,说是句柄无效。
然后把这个窗口改成模态窗口,就成功了,搞不懂,难道真是非模态和模态的原因?
串口控件是CPort,监控线程中用到了CPort的WaitForEvent这个函数,源代码如下:
// waits for event to occur on serial portprocedure TCustomComPort.WaitForEvent(var Events: TComEvents; StopEvent: THandle; Timeout: Integer);var Overlapped: TOverlapped; Mask: DWORD; Success: Boolean; Signaled, EventHandleCount: Integer; EventHandles: array[0..1] of THandle;begin // cannot call method if event thread is running if FThreadCreated then raise EComPort.CreateNoWinCode(CError_ThreadCreated); FillChar(Overlapped, SizeOf(TOverlapped), 0); Overlapped.hEvent := CreateEvent(nil, True, False, nil); EventHandles[0] := Overlapped.hEvent; if StopEvent <> 0 then begin EventHandles[1] := StopEvent; EventHandleCount := 2; end else EventHandleCount := 1; try SetCommMask(FHandle, EventsToInt(Events)); // let's wait for event or timeout Success := WaitCommEvent(FHandle, Mask, @Overlapped); if (Success) or (GetLastError = ERROR_IO_PENDING) then begin Signaled := WaitForMultipleObjects(EventHandleCount, @EventHandles, False, Timeout); Success := (Signaled = WAIT_OBJECT_0) or (Signaled = WAIT_OBJECT_0 + 1) or (Signaled = WAIT_TIMEOUT); SetCommMask(FHandle, 0); end; if not Success then raise EComPort.Create(CError_WaitFailed, GetLastError); Events := IntToEvents(Mask); finally CloseHandle(Overlapped.hEvent); end;end;