gpt4 book ai didi

c++ - VCL 应用程序何时获取其 Application->MainForm->Handle?

转载 作者:太空狗 更新时间:2023-10-29 22:57:09 25 4
gpt4 key购买 nike

我的应用程序使用 Message.hpp 中的 SendStructMessage() 函数通过传入消息填充一些面板。

SendStructMessage() 需要一个有效的窗口句柄才能发送到。

我已经将 SendStrucMessage() 封装在一个函数中,如下所示:

bool sendAppMessage(ApplicationMessageEnum msgID, void* s)
{
if(!Application || !Application->MainForm || !Application->MainForm->Handle)
{
Log(lError) << "Failed to get a valid handle when trying to send application message";
return false;
}
HWND h = Application->MainForm->Handle;

AppMessageStruct data;
data.mMessageEnum = msgID;
data.mData = s;

LRESULT res = SendStructMessage(h, UWM_MESSAGE, 0, &data);
if(res)
{
Log(lError) << "Sending message: "<<msgID<<" was unsuccesful";
return false;
}

return true;
}

尝试从 MainForm 的 OnShowOnCreate 事件调用它不起作用,因为在这两种情况下 Application->MainForm->Handle 仍然是 NULL。

我的问题是,在 VCL 应用程序的启动阶段,在哪里可以确定 Application->MainForm->Handle 确实已创建?

目前我启动了一个计时器来检查有效句​​柄:

void __fastcall TMain::WaitForHandleTimerTimer(TObject *Sender)
{
if(Application->MainForm->Handle)
{
WaitForHandleTimer->Enabled = false;

//Send a message to main ui to update sequence shortcuts
if(sendAppMessage(abSequencerUpdate) != true)
{
Log(lDebug)<<"Sending sequencer update to UI was unsuccesful";
}
}
}

有没有更好的办法?

最佳答案

TWinControl::Handle属性 getter 创建一个新的 HWND在读取属性时,如果 HWND尚未创建。如果在创建 HWND 时发生错误, 将抛出异常。

所以,你的 !Handle条件总是为假,因为Handle属性永远不会返回 NULL(但是 WindowHandle 属性可以)。

bool sendAppMessage(ApplicationMessageEnum msgID, void* s)
{
if (!((Application) && (Application->MainForm)))
{
Log(lError) << "Failed to get a valid handle when trying to send application message";
return false;
}

AppMessageStruct data;
data.mMessageEnum = msgID;
data.mData = s;

LRESULT res = SendStructMessage(Application->MainForm->Handle, UWM_MESSAGE, 0, &data);
if (res)
{
Log(lError) << "Sending message: " << msgID << " was unsuccesful";
return false;
}

return true;
}

如果你想检查 Handle在没有实际创建的情况下创建,使用表单的 HandleAllocated()方法:

bool sendAppMessage(ApplicationMessageEnum msgID, void* s)
{
if (!((Application) && (Application->MainForm) && (Application->MainForm->HandleAllocated())))
{
Log(lError) << "Failed to get a valid handle when trying to send application message";
return false;
}

AppMessageStruct data;
data.mMessageEnum = msgID;
data.mData = s;

LRESULT res = SendStructMessage(Application->MainForm->Handle, UWM_MESSAGE, 0, &data);
if (res)
{
Log(lError) << "Sending message: " << msgID << " was unsuccesful";
return false;
}

return true;
}

否则,不要使用SendMessage()/SendStructMessage()根本。您可以调用表单的Perform()方法,它将消息直接传递给表单的分配 WindowProc无需任何 HWND完全:

bool sendAppMessage(ApplicationMessageEnum msgID, void* s)
{
if (!((Application) && (Application->MainForm))
{
Log(lError) << "Failed to get a valid handle when trying to send application message";
return false;
}

AppMessageStruct data;
data.mMessageEnum = msgID;
data.mData = s;

LRESULT res = Application->MainForm->Perform(UWM_MESSAGE, 0, (LPARAM)&data);
if (res)
{
Log(lError) << "Sending message: " << msgID << " was unsuccesful";
return false;
}

return true;
}

或者,考虑删除 MainForm来自 sendAppMessage() 的依赖.您可以发送至Application->Handle相反,然后有 MainForm使用 Application->HookMainWindow() 注册回调方法.

bool sendAppMessage(ApplicationMessageEnum msgID, void* s)
{
if (!((Application) && (Application->Handle))
{
Log(lError) << "Failed to get a valid handle when trying to send application message";
return false;
}

AppMessageStruct data;
data.mMessageEnum = msgID;
data.mData = s;

LRESULT res = SendStructMessage(Application->Handle, UWM_MESSAGE, 0, &data);
if (res)
{
Log(lError) << "Sending message: " << msgID << " was unsuccesful";
return false;
}

return true;
}

__fastcall TMainForm::TMainForm(TComponent *Owner)
: TForm(Owner)
{
Application->HookMainWindow(&AppMessage);
}

__fastcall TMainForm::~TMainForm()
{
Application->UnhookMainWindow(&AppMessage);
}

bool __fastcall TMainForm::AppMessage(TMessage &Message)
{
if (Message.Msg == UWM_MESSAGE)
{
WindowProc(Message);
return true;
}
return false;
}

关于c++ - VCL 应用程序何时获取其 Application->MainForm->Handle?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45701239/

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