【问题标题】:Why isn't FindWindowEx finding the label in my window?为什么 FindWindowEx 在我的窗口中找不到标签?
【发布时间】:2012-05-13 06:58:12
【问题描述】:

我正在尝试调试一个用 C# 编写的小测试驱动程序应用程序。它打开了我们拥有的测试应用程序的几个实例。测试应用程序连接到服务器,并在成功连接后在标签中显示“REMOTE_CONNECTED”。因此,测试驱动程序会在尝试将数据输入到测试应用程序之前寻找它。

代码如下:

  Console.Out.WriteLine("MAIN HANDLE IN GETCONN: " + Hwnd);
  //Attempt to find if we have have connected to the remote server
  IntPtr connHwnd = FindWindowEx(Hwnd, IntPtr.Zero, null, "REMOTE_CONNECTED");

connHwnd 总是返回 IntPtr.Zero 并且打印到控制台的 Hwnd 是我期望的测试应用程序的句柄。测试驱动程序在循环中坐了一会儿,反复调用上面的代码,直到找到那个标签。我可以在屏幕上看到标签显示“REMOTE_CONNECTED”但该函数没有找到它。

此外,其他人已经让它在 XP 上工作(而我在 Windows 7 上)。

最后,如果我在 Visual Studio 中运行它并设置一些断点,那么它似乎可以工作。所以这似乎不是逻辑缺陷,而是某种时间或争用问题。

【问题讨论】:

  • 记住 FindWindowEx 搜索的是 GetWindowText 字符串,而不是 WM_GETTEXT 值。
  • Spy++ 对追踪此类事件非常有帮助。
  • 是的,我读过其他帖子,但真正让我困惑的是,它在设置断点时有效。我也会调查一下陈先生的建议。
  • 所以在 Spy++ 中查看,似乎父窗口句柄与我在代码中打印的句柄不同。很有趣……至少这让我有继续前进的动力。

标签: c# .net winapi windows-7 windows-xp


【解决方案1】:

我的问题原来与这个问题中的类似:

Why can't get the main window handle for a started process?

我的 MainWindowHandle 没有设置为我期望的窗口(我使用 Spy++ 发现了它,感谢 Rob P.!)。因此,我使用 EnumWindows 编写了一些代码来查找我正在寻找的窗口(请参阅链接帖子中 Joshua 的回答),然后使用该窗口句柄传递给 FindWindowEx,一切都按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多