【问题标题】:Is there way to check whether a Form has a Form Border? (by handle)有没有办法检查表单是否有表单边框? (按把手)
【发布时间】:2012-07-18 01:40:58
【问题描述】:

我想通过句柄检查表单是否有表单边框。 而且,句柄来自另一个应用程序。

我该如何处理? 请帮助我.. 谢谢!

【问题讨论】:

  • Windows 窗体?本机Win32?还有什么? -- 请注意,C# 作为一种语言 对句柄和窗口等一无所知,因此您的问题一定是关于特定 UI 框架的。请相应地标记。
  • P.S. Win32 甚至不区分窗口和控件。从技术上讲,它们都是“窗口”,尽管属性不同。
  • hmm.. 我只想知道它是否有 FormBorder。句柄来自另一个应用程序。
  • @jn4kim:那应该是你的问题。正如 stakx 所说,控件本身就是窗口。
  • @jn4kim:我的问题仍然存在。看来您在谈论Winforms。但是,如果其他应用程序是本机代码或 WPF 怎么办? FormBorder 的概念可能对这些毫无意义......

标签: c# winforms handle formborderstyle


【解决方案1】:
[DllImport("user32.dll")]
extern static int GetWindowLong(IntPtr hWnd, int nIndex);

const int GWL_STYLE = -16;
const int WS_BORDER = 0x00800000;  // thin border
const int WS_THICKFRAME = 0x00040000;  // sizing (thick) border

public static bool NativeWindowHasBorder(IntPtr hWnd)
{
     return (GetWindowLong(hWnd, GWL_STYLE) & (WS_BORDER | WS_THICKFRAME)) != 0;
}

【讨论】:

  • 如果使用IntPtr,不应该是GetWindowLongPtr吗?或者GetWindowLong,如果你使用Int32?或者:为什么要进行.ToInt64() 转换?
  • @stakx 是的。我不记得如何将窗口样式从我的头顶上取下并从做错的人那里粘贴。我已经更正了。
  • GetWindowLongPtr 不是必需的,因为 WS_BORDER 和 WS_THICKFRAME 位都在前 32 位内。
【解决方案2】:

Controls 自己实际上没有句柄。 Control.Handle 实际上返回它的父窗口的.Handle

来自MSDN for Control.Handle

获取控件绑定的窗口句柄。

如果您查看 Control 的反编译源代码,您会看到:

internal IntPtr HandleInternal
{
  get
  {
    return this.window.Handle;
  }
}

编辑

我上面所说的完全不正确。出于历史原因,我将其保留。

通过将Button 放在Form 上并查看它们的IntPtr Handle 值,可以很容易地证明这一点。它们是不同的。

【讨论】:

  • 嗯,发布反编译的框架代码是个好主意/合法吗...?我不想 FUD 你,但这可能值得考虑。 PS:如果不了解this.window 的含义,那么反编译的代码几乎毫无意义。
  • 谢谢你的回答,但这不是我想知道的,我想我没有正确写出问题
  • @stakx 我认为很明显 Control 本身没有句柄,而是返回它的父窗口句柄。正如 MSDN 文本所描述的那样。
  • @Jonathon:-1。我相信您的回答是不正确的,而且我确信控件也有句柄。您的回答实际上支持这一点:在 Win32 API 用语中,控件在技术上也是“窗口”(Winforms 基于 Win32),所以当您假设“窗口句柄”表示“父窗口句柄”时,我认为您错了。相反,Control.Handle“窗口句柄”指的是控件的内部HWND
  • @stakx 你是绝对正确的。我刚刚做了一个快速测试,事实上,IntPtr Handle 的值在Form 上的FormButton 之间是不同的。以前使用过 Spy++ 100 次,我应该想到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 2022-06-10
相关资源
最近更新 更多