SendMessage WM_COPYDATA msg 从 VC 到 BCB:失败,但 BCB 到 BCB:通过

SendMessage WM_COPYDATA msg From VC to BCB : Fail, but BCB to BCB : Pass

我不明白为什么从 VC++ 应用程序(主)发送 WM_COPYDATA 到 BCB 应用程序(从)失败,但是从 BCB 应用程序(主)到 BCB应用程序(从)通过。我已经在 BCB 和 VC++ 的调试模式下验证了 HWND,它们都是相同的值 (0x00030BEE)。

下面是我的代码,很简单

VC 主控 (.cpp)(32 位)

char ss[] = "1234";
HWND hwnd = ::FindWindowA(NULL, "12345678");//12345678 = Slave Window
COPYDATASTRUCT copydata;
memset(&copydata, 0, sizeof(copydata));
copydata.dwData = 0;
copydata.cbData = strlen(ss);
copydata.lpData = ss;
SendMessage(hwnd, WM_COPYDATA, (WPARAM)GetSafeHwnd(), (LPARAM)&copydata);

BCB 主机 (.cpp)(32 位)

char ss[] = "1234";
HWND hwnd = ::FindWindow(NULL, "12345678");//12345678 = Slave Window
COPYDATASTRUCT copydata;
memset(&copydata, 0, sizeof(copydata));
copydata.dwData = 0;
copydata.cbData = strlen(ss);
copydata.lpData = ss;
::SendMessage(hwnd, WM_COPYDATA, (WPARAM)Application->Handle, (LPARAM)&copydata);

VC++和BCB的唯一区别是GetSafeHwnd()Application->Handle。调用FindWindow()后,VC++中的HWND和BCB中的HWND是相同的值(0x00030BEE)。

BCB 从站(.h)(32 位)

void __fastcall OnCopyData(TMessage &Msg);
BEGIN_MESSAGE_MAP
    VCL_MESSAGE_HANDLER(WM_COPYDATA,TMessage, OnCopyData)
END_MESSAGE_MAP(TForm)

BCB 从站(.cpp)

void __fastcall TForm1::OnCopyData(TMessage &Msg)
{
    ::OutputDebugString("123");
}

BCB slave可以从BCB master获取消息,并输出123消息。但是它无法从 VC++ master.

获取消息

我很困惑。有谁知道如何解决这个问题?

环境:Win7,专业版,64 位

来自 Remy Lebeau 的评论,更改 visual c++ 设置或调用 ChangeWindowMessageFilterEx 可以解决此问题。