有人写过用线程处理窗口消息的程序吗?(100分)

  • 主题发起人 主题发起人 DepYuka
  • 开始时间 开始时间
D

DepYuka

Unregistered / Unconfirmed
GUEST, unregistred user!
我相用线程处理一个由该线程创建的窗口的消息,但老是出问题.
1)执行CreateWindowEx老是出错,RegisterClass的TWndClass内容如下:
With T_WindowClassdo
begin
style := 0;
lpszMenuName := nil;
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := 0;
hIcon := 0;
hCursor := 0;
hbrBackground := 0;
lpszClassName := 'TSocketMSGWindow';
lpfnWndProc := @SocketWndProc;
end;
然后执行
FSocketMsgProcHWND := CreateWindowEx( WS_EX_TOOLWINDOW
, T_WindowClass.lpszClassName , ''
, WS_POPUP{!0}, 0, 0, 0, 0, 0, 0, HInstance, nil);
的时候就出错了,先是发送了一条消息到SocketWndProc所在的消息处理过程,然后又发了一条HWND为0的消息到SocketWndProc,这时处理之后就出错了.请问是什么一回事??
 
没遇见过,进来学习一下
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=1193
 
窗口的消息只能归它所属的线程处理
 
你到www.2ccc.com这里有李维的新书《Inside VCL》的第一章里就有这个例子.说的很清楚.
 
哈哈,解决了,总结有几个地方没做好.
1)没有加stdcall;export;在消息回调函数后.
2)创建窗口是在TThread.Create里,这时创建的窗口的消息处理是属于主线程,移到Execute里就行了.
3)改用以下代码来创建窗口,根本不需要注册窗口类.而且可以用Pascal的风格来处理消息,爽!多谢xwings的例子.
FSocketMsgProcHWND := CreateWindow( 'STATIC','',WS_POPUP, 0, 0, 0, 0, 0, 0, HInstance, nil);
SetWindowLong(FSocketMsgProcHWND, GWL_WNDPROC
, Longint(MakeObjectInstance(SyncWindowProc))
);
 
xwings,消息回调函数SyncWindowProc改为以下更好,这样可以用Delphi自己的格式处理消息.不需要老是case ....do
了.
try
Dispatch(Message);
except
if Assigned(ApplicationHandleException) then
ApplicationHandleException(Self);
end;
 
后退
顶部