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(©data, 0, sizeof(copydata));
copydata.dwData = 0;
copydata.cbData = strlen(ss);
copydata.lpData = ss;
SendMessage(hwnd, WM_COPYDATA, (WPARAM)GetSafeHwnd(), (LPARAM)©data);
BCB 主机 (.cpp)(32 位)
char ss[] = "1234";
HWND hwnd = ::FindWindow(NULL, "12345678");//12345678 = Slave Window
COPYDATASTRUCT copydata;
memset(©data, 0, sizeof(copydata));
copydata.dwData = 0;
copydata.cbData = strlen(ss);
copydata.lpData = ss;
::SendMessage(hwnd, WM_COPYDATA, (WPARAM)Application->Handle, (LPARAM)©data);
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 可以解决此问题。
我不明白为什么从 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(©data, 0, sizeof(copydata));
copydata.dwData = 0;
copydata.cbData = strlen(ss);
copydata.lpData = ss;
SendMessage(hwnd, WM_COPYDATA, (WPARAM)GetSafeHwnd(), (LPARAM)©data);
BCB 主机 (.cpp)(32 位)
char ss[] = "1234";
HWND hwnd = ::FindWindow(NULL, "12345678");//12345678 = Slave Window
COPYDATASTRUCT copydata;
memset(©data, 0, sizeof(copydata));
copydata.dwData = 0;
copydata.cbData = strlen(ss);
copydata.lpData = ss;
::SendMessage(hwnd, WM_COPYDATA, (WPARAM)Application->Handle, (LPARAM)©data);
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 可以解决此问题。