我试图在两个单独的项目之间发送消息,但我的问题是我试图让接收器在一个TThread对象内运行,但WndProc不会在一个Object内部工作,必须是一个函数,无论如何都要在里面创建一个窗口一个可以处理线程内消息的TThread?
这就是我的意思
function TDataThread.WindowProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin Result := 0; case uMsg of WM_DATA_AVA: MessageBox(0,'Data Avaibale','Test',0); else Result := DefWindowProc(hwnd,uMsg,wParam,lParam); end; end; Procedure TDataThread.Create(const Title:String); begin HAppInstance := HInstance; with WndClass do begin Style := 0; lpfnWndProc := @WindowProc; //The Error Lies here (Variable required) cbClsExtra := 0; cbWndExtra := 0; hInstance := HAppInstance; hIcon := 0; hCursor := LoadCursor(0,IDC_ARROW); hbrBackground := COLOR_WINDOW; lpszMenuName := nil; lpszClassName := 'TDataForm'; end; Windows.RegisterClass(WndClass); MainForm := CreateWindow('TDataForm',PAnsiChar(Title),WS_DLGFRAME,XPos,YPos,698,517,hInstance,nil); end;
我需要一个表单,以便我可以从另一个应用程序获取其句柄如果需要使用FindWindow和FindWindowEx
解决方法
在后台线程中运行wndproc可以在Win32中完成,但它被广泛认为是一个坏主意.
为此,您必须确保后台线程包含消息调度循环:GetMessage / TranslateMessage / DispatchMessage.您必须确保在后台线程中创建要在后台线程中处理消息的窗口句柄(在后台线程的上下文中调用CreateWindow)及其所有子窗口.而且你必须确保你的后台线程经常调用它的消息循环,除了它正在做的任何其他事情(这有点违背了使用后台线程的目的!)
如果您的后台线程没有消息循环,则在后台线程上创建的窗口句柄将永远不会收到任何消息,因此不会发生任何事情.
现在,为什么你不应该这样做:Windows是消息驱动的,这意味着它们本身就是一个合作多任务调度系统.每个GUI窗口应用程序都必须在主线程中有一个消息循环来完成任何事情.该消息循环将支持几乎任何数量的窗口,所有窗口都在主线程上.正确实现的UI将不会在主线程中执行任何阻止执行的操作,因此消息循环将始终准备就绪并具有响应性.
因此,如果主线程上的现有消息循环将处理所有窗口消息传递需求而不会阻塞或冻结,那么为什么要通过尝试在后台线程中运行第二个消息循环来使您的生活变得更复杂?使用后台线程没有任何好处.