【问题标题】:Retrieve Handle to Windows Explorer's Address bar Edit Control检索 Windows 资源管理器地址栏编辑控件的句柄
【发布时间】:2012-04-05 12:37:06
【问题描述】:

我需要检索最活跃的 Windows Explorer 实例的完整路径。

所以我通过调用来获得 Explorer.exe 的句柄 HWND l_pExplorerhwnd = ::GetForegroundWindow();

使用检索到的这个句柄,我需要检索它的地址栏编辑控件。 我使用了 Spy++ 并获得了编辑控件的类名 ToolbarWindow32

现在,我尝试使用 FindWindowEx 使用以下代码 sn-p 查找窗口。但我无法找回它。请帮忙

  HWND l_pExplorerhwnd = ::GetForegroundWindow();
  TCHAR l_szTempName[MAX_PATH];

  if(l_pExplorerhwnd)
  {
    ::GetWindowModuleFileName(l_pExplorerhwnd, l_szTempName, MAX_PATH);
    MessageBox(0, l_szTempName, 0, 0);
    if(::FindWindowEx(l_pExplorerhwnd, NULL, L"ToolbarWindow32", NULL))
    {
      ::GetWindowText(::FindWindowEx(l_pExplorerhwnd, NULL, L"ToolbarWindow32", NULL), l_szTempName, MAX_PATH);
      MessageBox(0, l_szTempName, 0, 0);
    }
    else
    {
      MessageBox(0, L"Error Error ", 0, 0);
    }
  }
  else
  {
    MessageBox(0, L"Error Error Error", 0, 0);
  }

【问题讨论】:

  • 永远永远不要与其他进程窗口层次结构混淆 - 它们可以随时更改,这很粗鲁。 shdocvw 中的 ShellWindowsClass 之类的 API 可能会满足您的需求,但即使是这种事情也令人不悦。几乎没有正当理由去做你想做的事。
  • 也许你可以描述一下你打算用地址栏做什么。也许有更好的方法。 (例如,如果您只想知道资源管理器窗口正在查看什么,或者如果您想更改它正在查看的内容,您可以use the automation interface。如果您想将资源管理器合并到您的程序中,那么use the ExplorerBrowser object。 )

标签: c++ windows mfc explorer


【解决方案1】:

要直接回答您的问题,FindWindowEx 适用于父窗口的直接子窗口,而不是后代窗口。因此,您需要一个一个地遍历孩子:

CabinetWClass
WorkerW
ReBarWindow32
Address Band Root
msctls_progress32
Breadcrumb Parent
ToolbarWindow32

请注意,这个层次结构只是我现在系统上的样子。正如 Tom Whittock 所提到的,使用它是非常糟糕的做法。您不知道窗口层次结构是否会随着更新而改变,甚至是在运行时设计的。

关于您的代码的更多评论。由于您使用的是 TCHAR 映射(即使现在通常没有理由使用它,除非您打算支持 Win98-),您的字符串文字应该是 _T("") 而不是 L""

【讨论】:

  • 非常感谢。我刚刚尝试过,并通过检查 SPY++ 得到了答案。还是非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 2010-11-29
  • 2010-12-30
相关资源
最近更新 更多