我相用线程处理一个由该线程创建的窗口的消息,但老是出问题.1)执行CreateWindowEx老是出错,RegisterClass的TWndClass内容如下:
With T_WindowClass do
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,这时处理之后就出错了.请问是什么一回事??

解决方案 »

  1.   

    书上说可以做消息循环,线程里放上这么一段就行了,由这里调用那个回调函数.        while GetMessage(MsgBlock,0,0,0) do
            begin
                TranslateMessage(MsgBlock);
                DispatchMessage(MsgBlock);
            end;问题是现在我创建窗口时出错.
      

  2.   

    你如果不在主线程创建窗口,当然要在这个线程实现消息循环。
    看你上面的代码分析,创建消息失败的原因主要有
    1,registerclass的时候失败。
    2,你SocketWndProc的不是标准窗口回调函数,比如不是用stdcall申明。
    3,你SocketWndProc处理了WM_NCCREATE消息并返回0,
    4,你SocketWndProc处理了WM_CREATE消息并返回-1.
      

  3.   

    我的SocketWndProc的确没有用stdcall声明,这方面都没资料告诉我... :(关于registerclass的错误,我用以下调用方法解决了问题.
    FSocketMsgProcHWND := CreateWindow( 'STATIC','',WS_POPUP, 0, 0, 0, 0, 0, 0, HInstance, nil);
    SetWindowLong(FSocketMsgProcHWND, GWL_WNDPROC
                ,Longint(@SocketWndProc) );
    问题又来了,窗口已经创建好,也能接收消息,但我跟踪程序,竟然发现程序处理消息的时候根本没执行过
    while GetMessage(MsgBlock,0,0,0) do
    begin
        TranslateMessage(MsgBlock);
        DispatchMessage(MsgBlock);
    end;
    线程只是在GetMessage那里停住,接收消息时跟本不执行块内的TranslateMessage和DispatchMessage,这我就迷糊了,是什么地方在处理我的消息呢?我又没用MakeObjectInstance(SyncWindowProc)这种方法去处理消息回调函数.消息循环应该不是在主线程里啊.
      

  4.   

    找一个C SDK的程序改改,不晓得能不能用!
      

  5.   

    噢,原来我的CreateWindow没有放在Thread.Execute里,所以消息处理是在主线程里.这下所有问题都解决了.