gpt4 book ai didi

c# - SendMessage 与 WndProc

转载 作者:太空狗 更新时间:2023-10-29 21:07:18 24 4
gpt4 key购买 nike

我正在尝试扩展 TextBox 控件以添加水印功能。我在 CodeProject 上找到的示例使用的是导入的 SendMessage 函数。

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);

void SetWatermark()
{
SendMessage(this.Handle, 0x1501, 0, "Sample");
}

我想知道为什么不使用 protected WndProc 来代替

void SetWatermark()
{
var m =new Message() { HWnd = this.Handle, Msg = 0x1501, WParam = (IntPtr)0, LParam = Marshal.StringToHGlobalUni("Sample") };
WndProc(ref m);
}

两者似乎都工作正常。我在 Internet 上看到的几乎所有示例都使用 SendMessage 函数。这是为什么? WndProc 函数不是用来代替SendMessage 的吗?

附言我不知道将 string 转换为 IntPtr 是否正确,发现 Marshal.StringToHGlobalUni 工作正常。这样做是正确的功能吗?

最佳答案

WndProc不替换 SendMessage,它是 WindowProc 的 .NET 等价物. WndProc 由应用程序的消息泵调用(它接收由 SendMessagePostMessage 发送或发布的消息)来处理它们。通过直接调用 WndProc,您可以绕过 Windows 执行的特殊消息处理,例如捆绑 WM_PAINT 消息,并且可能会导致消息出现在命令它们在您的应用程序中被 Windows 期望。

MSDN 中所述,

All messages are sent to the WndProc method after getting filtered through the PreProcessMessage method.

The WndProc method corresponds exactly to the Windows WindowProc function. For more information about processing Windows messages, see the WindowProc function documentation in the MSDN library at http://msdn.microsoft.com/library.

通过直接调用它,您剥夺了系统执行预处理或对该消息进行任何其他处理的机会。 .NET 框架在 Windows 之上运行,如果不发送或发布消息,底层系统将无法对该消息执行任何操作,因此您将失去底层系统可能为您执行的任何操作。

关于c# - SendMessage 与 WndProc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2539903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com