SendMessage功能用于直接向窗口过程发送消息。SendMessage调用一个窗口过程,并等待该过程处理消息并返回结果。
消息可以发送到系统中的任何窗口;所需要的只是一个窗口句柄。Windows使用句柄来确定哪个窗口过程应该接收消息。
在处理可能从另一个线程发送的消息之前,窗口过程应首先调用InSendMessage函数。如果此函数返回TRUE,则窗口过程应在使线程产生控制的任何函数之前调用ReplyMessage,如以下示例所示。
case WM_USER + 5:
if(InSendMessage())
ReplyMessage(TRUE);
DialogBox(hInst, "MyDialogBox", hwndMain, (DLGPROC) MyDlgProc);
break;
可以在对话框中的控件中发送一些消息。这些控制消息设置控件的外观,行为和内容,或检索有关控件的信息。例如,CB_ADDSTRING消息可以将字符串添加到组合框,并且BM_SETCHECK消息可以设置复选框或单选按钮的检查状态。
使用SendDlgItemMessage函数向控件发送消息,指定控件的标识符和包含控件的对话框窗口的句柄。以下示例从对话框过程中将组合框的编辑控件中的字符串复制到其列表框中。该示例使用SendDlgItemMessage将CB_ADDSTRING消息发送到组合框。
HWND hwndCombo;
int cTxtLen;
PSTR pszMem;
开关(uMsg)
{
case WM_COMMAND:
开关(LOWORD(wParam))
{
case IDD_ADDCBITEM:
//获取组合框的句柄和
//编辑控件中字符串的长度
//组合框。
hwndCombo = GetDlgItem(hwndDlg, IDD_COMBO);
cTxtLen = GetWindowTextLength(hwndCombo);
//为字符串分配内存并复制
//将字符串插入内存。
pszMem = (PSTR) VirtualAlloc((LPVOID) NULL,
(Dvord)(Ktstlen + 1),Mem_kmit,hi-Latn
PAGE_READWRITE);
GetWindowText(hwndCombo,pszMem,
cTxtLen + 1);
//将字符串添加到列表框中
//组合框并从中删除字符串
//编辑组合框的控件。
if (*pszMem != NULL)
{
SendDlgItemMessage(hwndDlg,IDD_COMBO,
CB_ADDSTRING, 0,
(DWORD) ((LPSTR) pszMem));
SetWindowText(hwndCombo, (LPSTR) NULL);
}
//释放内存并返回。
VirtualFree(pszMem, 0, MEM_RELEASE);
return TRUE;
//
//处理其他对话框命令。
//
}
//
//处理其他对话框消息。
//
}