【问题标题】:WM_SETFOCUS, where defined for C#?WM_SETFOCUS,在哪里为 C# 定义?
【发布时间】:2023-04-10 07:19:02
【问题描述】:

我需要找出 WM_SETFOCUS 的定义位置。 例如,我知道它不是 System.Windows.Forms.WM_SETFOCUS

我在网上查了一下,似乎一切都只是使用了这个名字,没有提到如何让你的编译器知道这个名字。

我确实知道它代表的整数值,但我真的想引用权威程序集,而不仅仅是在我的代码中乱扔常量。

我在实现 IMessageFilter 的类中使用该值。

添加细节:

使用 IMessageFilter, 我收到消息,并且消息有一个 Msg 字段 (int) 来标识它的类型。在哪里可以找到这些整数值的 C# 定义? (我不需要一个名为 WM_SETFOCUS 的东西,我只需要包含我收到的值的所有定义的东西。) 既然 Microsoft 提供了 IMessageFilter,他们不应该也提供使其有用所需的信息吗?

【问题讨论】:

  • WM_SETFOCUS 正式存在于 Windows SDK 的 WinUser.h 中,而不是托管世界中。您可以找到一些定义了托管等效项的地方(为此使用反射器)但它不是官方的(因为 .NET 框架也被认为是“可移植的”)

标签: c# definition


【解决方案1】:

它似乎是在System.Windows.Forms.NativeMethods.WM_SETFOCUS 中定义的(不幸的是,它是一个内部类)。它也在Microsoft.VisualStudio.NativeMethods.WM_SETFOCUS中定义

【讨论】:

  • 知道什么 dll 包含 Microsoft.VisualStudio.NativeMethods 吗?
【解决方案2】:

如果您担心使用本机方法乱扔代码,我会像框架一样创建一个内部NativeMethods 静态类,并将所有与互操作相关的内容转储到其中。至少您可以将所有内容保存在一个地方。

【讨论】:

  • 我只是不想要复制几十个值的开销,并引用它们的来源以便未来的可维护性。
  • WM_SETFOCUS 的值和相关消息永远不会改变 - Microsoft 无法在不破坏每个写入的每个 Windows 程序的情况下更改它们。
  • @Mark:为数不多的适合使用公共 const 的情况之一。没有开销,也没有维护。
猜你喜欢
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
相关资源
最近更新 更多