SendMessage 仅发送字符串的*第一个*字符
SendMessage only send the *first* character of the string
我正在使用以下 python 代码将字符串发送到 RAD Studio C++ Builder 构建的应用程序:
import win32con
import win32gui
import ctypes
import ctypes.wintypes
FindWindow = win32gui.FindWindow
SendMessage = ctypes.windll.user32.SendMessageW
class COPYDATASTRUCT(ctypes.Structure):
_fields_ = [
('dwData', ctypes.wintypes.LPARAM),
('cbData', ctypes.wintypes.DWORD),
('lpData', ctypes.c_wchar_p)
]
hwnd = FindWindow(None, "SIGNAL")
cds = COPYDATASTRUCT()
cds.dwData = 0
mystr = "This is a message to signal..."
cds.cbData = ctypes.sizeof(ctypes.create_unicode_buffer(mystr))
cds.lpData = ctypes.c_wchar_p(mystr)
SendMessage(hwnd, win32con.WM_COPYDATA, 0, ctypes.byref(cds))
完美找到对方应用,SendMessage发送数据
我的问题:它只发送字符串的第一个字符。因此,而不是: "This is a message to signal..."
,它只发送 "T"
.
我确信我忽略了一些微不足道的东西,但我找不到它。
听起来您的 C++ 代码将 cds.lpData
解释为 char*
而不是 wchar_t*
,并且可能没有注意 [=13] 指示的字节数=],要么。
此外,Python 代码应该将 cds.lpData
设置为(指向)您从 mystr
创建的 Unicode 缓冲区,而不是(指向)mystr
本身。
为了支持所有可能 运行 进入同一个 task/issue,有效的“接收”代码(RAD Studio C++ 构建器)是:
void __fastcall Tmain_form::WMCopyData(TMessage& Message) // Receiving messages from Python script in C++ Builder
{
int DataSize;
wchar_t* Data;
COPYDATASTRUCT* CopyData = reinterpret_cast <COPYDATASTRUCT*> (Message.LParam);
DataSize = CopyData->cbData;
if (DataSize > 0)
{
Data = new wchar_t[DataSize];
memcpy(Data, CopyData->lpData, DataSize);
// Process your data....
delete [] Data;
}
}
为了完整起见,这将转到 'protected' 下方的头文件:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_COPYDATA, TMessage, WMCopyData)
END_MESSAGE_MAP(TForm)
我正在使用以下 python 代码将字符串发送到 RAD Studio C++ Builder 构建的应用程序:
import win32con
import win32gui
import ctypes
import ctypes.wintypes
FindWindow = win32gui.FindWindow
SendMessage = ctypes.windll.user32.SendMessageW
class COPYDATASTRUCT(ctypes.Structure):
_fields_ = [
('dwData', ctypes.wintypes.LPARAM),
('cbData', ctypes.wintypes.DWORD),
('lpData', ctypes.c_wchar_p)
]
hwnd = FindWindow(None, "SIGNAL")
cds = COPYDATASTRUCT()
cds.dwData = 0
mystr = "This is a message to signal..."
cds.cbData = ctypes.sizeof(ctypes.create_unicode_buffer(mystr))
cds.lpData = ctypes.c_wchar_p(mystr)
SendMessage(hwnd, win32con.WM_COPYDATA, 0, ctypes.byref(cds))
完美找到对方应用,SendMessage发送数据
我的问题:它只发送字符串的第一个字符。因此,而不是: "This is a message to signal..."
,它只发送 "T"
.
我确信我忽略了一些微不足道的东西,但我找不到它。
听起来您的 C++ 代码将 cds.lpData
解释为 char*
而不是 wchar_t*
,并且可能没有注意 [=13] 指示的字节数=],要么。
此外,Python 代码应该将 cds.lpData
设置为(指向)您从 mystr
创建的 Unicode 缓冲区,而不是(指向)mystr
本身。
为了支持所有可能 运行 进入同一个 task/issue,有效的“接收”代码(RAD Studio C++ 构建器)是:
void __fastcall Tmain_form::WMCopyData(TMessage& Message) // Receiving messages from Python script in C++ Builder
{
int DataSize;
wchar_t* Data;
COPYDATASTRUCT* CopyData = reinterpret_cast <COPYDATASTRUCT*> (Message.LParam);
DataSize = CopyData->cbData;
if (DataSize > 0)
{
Data = new wchar_t[DataSize];
memcpy(Data, CopyData->lpData, DataSize);
// Process your data....
delete [] Data;
}
}
为了完整起见,这将转到 'protected' 下方的头文件:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_COPYDATA, TMessage, WMCopyData)
END_MESSAGE_MAP(TForm)