【问题标题】:How to uniquely Identify windows forms?如何唯一标识窗口窗体?
【发布时间】:2010-06-28 23:33:46
【问题描述】:

我的应用程序需要识别每个打开的应用程序的每种形式。例如,如果我在任何应用程序中按“Ctrl+f1”(比如说 microsoft Outlook),并且如果我在“新消息”表单中,我需要向我的应用程序发送一条消息,其中包含以下信息: 进程=outlook.exe form="new message" 表单ID? (或者任何唯一标识表单的东西? 这可能吗?

换句话说,windows 窗体是唯一标识的吗?

哦,窗口句柄不是解决方案,因为它们每次都会改变,我需要一些可以识别表单的东西,如果我关闭应用程序并重新打开它,它不会改变。

【问题讨论】:

  • 不是每个窗口都有唯一的句柄吗?

标签: .net winforms


【解决方案1】:

Windows 有一个唯一的 HWND。

thread 讨论如何获取当前活动窗口的信息。

你可以这样做,然后获取窗口标题。

【讨论】:

    【解决方案2】:

    请注意,其他应用程序(尤其是 Outlook)中的窗口很少是 Windows 窗体窗体。您需要大量的 P/Invoke 才能完成这项工作。您需要的第一件事是 SetWindowsHookEx() 设置 WH_KEYBOARD_LL 挂钩,以便您可以检测击键。谷歌搜索得很好。

    接下来,您需要 GetForegroundWindow(),它会为您获取具有焦点的窗口的窗口句柄。

    接下来,您需要 GetWindowThreadProcessId(),它可以让您发现拥有该窗口的进程的进程 ID。然后,您可以使用 Process.GetProcessById() 来获取程序的 Process 对象。那里有很多信息,Name 属性告诉你它是 Outlook.exe

    关于窗口本身的信息更难获得。那里不多,但您可以使用 GetWindowText() 来检索标题栏上显示的文本。如果有用的话,您可以使用 EnumChildWindows 枚举窗口中的子控件。

    访问 pinvoke.net 以获取所需的 P/Invoke 声明。

    【讨论】:

    • 谢谢 noBugz,对我来说重要的是获取窗口的唯一标识符并将其保存在我的应用程序中。目前我所能做的就是,就像你说的那样,获取窗口文本,但对我来说不是什么解决方案,想知道某处是否有窗口唯一标识符......
    • 呃,你从GetForegroundWindow得到的句柄值是唯一的。没有两个窗口会拥有相同的句柄值。
    • 一个窗口在打开时是否总是得到相同的句柄?(我所说的唯一是“总是相同的值(总是,例如重启后)”?像我一样想它我想为每个窗口记住其唯一标识符的数据库,以便在将信息发送到我的应用程序时能够识别它。
    • 不,句柄值会不同。标题文字也可能不同。
    【解决方案3】:

    每个窗口都有窗口句柄。这是唯一的 int32 值。这个值被 Win32 API 用来识别窗口。

    【讨论】:

    • 不,伙计们,请在发帖前阅读,确实它们是独一无二的,但它们的值不同(检查窗口把手,关闭并打开您的机器,然后再次检查把手,是一样的吗?)
    【解决方案4】:

    嗯 - 如果标题相同,您无法真正通过类型识别外部进程的窗口。

    您可以使用窗口的句柄 - 但是它在相同“类型”的窗口上会有所不同,并且仅在窗口存在时有效。

    您的想法看起来像是某种日志记录 - 并且日志记录句柄在 IMO 中不是很合理。

    【讨论】:

      【解决方案5】:

      虽然窗口句柄是唯一的,但是对于同一个窗体它们永远不会有相同的值,它们只是在它们之间是唯一的,但是一个窗口永远不会有它的句柄的相同和唯一的值,这将识别它。

      Windows 窗体不能被唯一标识。

      【讨论】:

        猜你喜欢
        • 2015-01-14
        • 2011-08-01
        • 1970-01-01
        • 2013-07-19
        • 2011-05-17
        • 1970-01-01
        • 1970-01-01
        • 2012-10-08
        • 1970-01-01
        相关资源
        最近更新 更多