gpt4 book ai didi

delphi - 在 TThread 内创建窗口

转载 作者:行者123 更新时间:2023-12-03 14:55:41 26 4
gpt4 key购买 nike

我试图在两个独立的项目之间发送消息,但我的问题是我试图让接收器在 TThread 对象内部运行,但 WndProc 无法在对象内部工作,必须是一个函数,无论如何都可以创建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, 0, 0, hInstance, nil);
end;

我需要一个表单,以便我可以根据需要使用 FindWindow 和 FindWindowEx 从另一个应用程序获取其句柄

最佳答案

在 Win32 中可以在后台线程中运行 wndproc,但它被广泛认为是一个坏主意。

为此,您必须确保后台线程包含消息调度循环:GetMessage/TranslateMessage/DispatchMessage。您必须确保要在后台线程中处理消息的窗口句柄是在后台线程及其所有子窗口上创建的(CreateWindow 在后台线程的上下文中调用)。而且您必须确保后台线程除了执行其他操作之外还频繁调用其消息循环(这有点违背了使用后台线程的目的!)

如果您的后台线程没有消息循环,则在后台线程上创建的窗口句柄将永远不会收到任何消息,因此什么也不会发生。

现在,为什么你不应该这样做:Windows 是消息驱动的,这意味着它们本质上是一个协作式多任务调度系统。每个 GUI Windows 应用程序都必须在主线程中有一个消息循环才能完成任何操作。该消息循环几乎支持任意数量的窗口,所有窗口都在主线程上。正确实现的 UI 不会在主线程中执行任何阻止执行的操作,因此消息循环将始终准备就绪并响应。

因此,如果主线程上的现有消息循环能够处理您所有的窗口消息传递需求而不会阻塞或卡住,那么您为什么要通过尝试在后台线程中运行第二个消息循环来使您的生活变得更加复杂呢?使用后台线程没有任何优势。

关于delphi - 在 TThread 内创建窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3638631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com