我如何处理WM_SETTEXT消息

时间:2018-08-13 04:13:46

标签: c++ winapi

我需要重绘窗口的NC区域并在其中设置自定义文本。因此,我可以重画,但是我不知道在窗口标题中使用什么来设置自己的文本。我尝试使用DefWindowProc函数,但是它突然绘制了默认的Windows标题栏,这是不必要的。使用SetWindowText也是不合适的,因为它会再次导致WM_SETTEXT消息。所以请帮助我,我只需要自定义窗口的标题,而无需任何图形默认标题栏。

LRESULT SkinWindow::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM 
lParam)
{
    ...
    case WM_SETTEXT:
      OnSetText(hWnd, wParam, lParam);
    break;
    ...
}

void SkinWindow::OnSetText(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
    DefWindowProc(hWnd, WM_SETTEXT, wParam, lParam);
    OnNcPaint(hWnd, wParam, lParam);
}

1 个答案:

答案 0 :(得分:0)

您必须完全处理two gettext messages

case WM_GETTEXT:
    lstrcpyn((LPTSTR)lParam, "Booga!", (int)wParam);
    return lstrlen((LPTSTR)lParam);
case WM_GETTEXTLENGTH: 
    return 7; // lstrlen("Booga!") + null

如果希望WM_SETTEXT正常工作,则必须将文本存储在自己的缓冲区中,并在查询文本时使用该缓冲区。切勿将它们传递给DefWindowProc,因为DefWindowProcHWND内部存储/检索文本。

注意:如果外部应用程序使用GetWindowText,则仍然会错误地读取它,因为跨进程发送时,它会从隐藏的内部存储器中读取。