私のアプリケーションは、Message.hpp
のSendStructMessage()
関数を使用して、着信メッセージによっていくつかのパネルに値を設定します。VCLアプリケーションはいつアプリケーション - >メインフォーム - >ハンドルを取得しますか?
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のOnShow
やOnCreate
イベントからこれを呼び出すしようとすると、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";
}
}
}
は、より良い方法はありますか?
[この質問](https://stackoverflow.com/q/37614161/62576)とそのコメント(同様に答え)が役立ちます。 Delphiにはタグが付いていますが、VCLは完全にその言語で書かれており、同じ情報が適用されます。質問へのコメントには、ここで重要なその他のリンクが含まれています。 –