c# - 将 WM_GETFONT 与标准平面样式一起使用时出现问题

标签 c# .net windows winapi fonts

我正在尝试获取其他应用程序中按钮的字体。

当我尝试 WM_GETFONT 时,它返回 0。这是我的代码:

[DllImport("User32.DLL")] public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); 

IntPtr fx = SendMessage(button1.Handle, 0x31, 0, 0); 

我知道问题的原因,它是由于 FlatStyle 属性

查看此链接

http://www.siao2.com/2008/09/26/8965526.aspx

我该如何解决这个问题?

我在 Windows 7 下使用 C#。

最佳答案

您获得该值是因为您正在检查的控件使用默认系统字体。
如果未明确指定自定义字体,则这些值正是你应该期待。

如果使用默认系统字体绘制控件文本,WM_GETFONT 消息将始终返回 0(或 NULL)。根据documentation :

The return value is a handle to the font used by the control, or NULL if the control is using the system font.

同样适用于 GetTextFace 函数。在这种情况下,相关 WM_SETFONT message 的文档提供了一些清晰的见解:如果 wParam 值为 NULL,控件将使用默认系统字体来绘制其文本。


显然您没有更改字体,或者至少 Windows 认为您没有更改。您提到您正在尝试获取其他 应用程序的字体——您如何更改用于在另一个应用程序的控件上绘制文本的字体?

如果您更改默认系统字体,上述行为仍然适用,无论您在屏幕上看到的是否不同。

如果您正在发送 WM_SETFONT 消息,您可能忘记告诉控件它应该重绘自己。同样,从上面链接的文档中提取:

lParam

The low-order word of lParam specifies whether the control should be redrawn immediately upon setting the font. If this parameter is TRUE, the control redraws itself.

关于c# - 将 WM_GETFONT 与标准平面样式一起使用时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4569723/

相关文章:

c# - 如何将 Hive 连接到 asp.net 项目

c# - 使用 HtmlAgilityPack 从 HTML 中提取电子邮件

c# - WriteVideoFrame() 与 Videocodec.Raw 更改像素值

c# - 多个客户端使用 Active Directory 进行身份验证

c# - 本地化 - 在 wpf 应用程序中更改语言

ios - 在 Windows 上开发 iOS 应用程序

c# - 使用 .Result 的异步方法

c# - html敏捷得不到结果

c - 转义序列\a 不起作用

在具有 IIS 配置的 Windows 上执行 PHP