【问题标题】:FindWindow and SetForegroundWindow alternatives?FindWindow 和 SetForegroundWindow 的替代品?
【发布时间】:2012-07-15 18:38:30
【问题描述】:

我正在寻找旧版User32.dll 的替代方案,即使用FindWindow()SetForegroundWindow() 切换到不同的应用程序。

我确实找到了第一个使用 Process.GetProcessesByName() 的替代方法,但我没有看到相应的方法来切换(设置活动/前台)到该应用程序。

有没有办法在不使用User32.dll 方式的情况下做到这一点?

感谢您的帮助。

编辑

我接受了@Sorceri 的答案,虽然这不是我想要的答案。

【问题讨论】:

  • 使用SetForegroundWindow有什么问题? Windows 操作系统会跟踪 Win32 子系统中的前台窗口,所以无论如何你都会 P/Invoking to user32.dll
  • @MichaelGraczyk:或者至少,我们假设安全...... :)
  • 在 Windows 桌面上我必须使用 user32.dll 在 Windows CE 上我必须使用 coredll.dll。所以使用DLLImport 总是表明你添加了错误的静态依赖。
  • 如果您需要切换到您的应用程序,这将回答您的问题:stackoverflow.com/a/32322918/463464

标签: c# .net process


【解决方案1】:

答案:没有。

但是,为了帮助下一个想找到一个窗口并从 C# 激活它的好奇者,您必须执行以下操作:

[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);

void ActivateApp(string processName)
{
    Process[] p = Process.GetProcessesByName(processName);

    // Activate the first application we find with this name
    if (p.Count() > 0)
        SetForegroundWindow(p[0].MainWindowHandle);
}

例如,要将记事本放在前面,您可以调用:

ActivateApp("notepad");

附带说明 - 对于那些试图将应用程序中的窗口 置于前台的人,只需致电 Activate() method

【讨论】:

  • 所以在我使用这种方法调出所需的进程后,我是否可以使用 SendKeys.SendWait("{ENTER}");毫无疑问,只要我的应用程序确实响应击键?
  • SendWait 上的文档建议您可以 - 让我们知道它是否有效!
  • 我试过了,奇怪的是它有时会工作,我觉得这对机器来说真的很奇怪。问题总是计算机按照我们告诉他们的去做,而不一定是我们想要的。我可能要问一个全新的问题。
【解决方案2】:

您可以使用SetActiveWindow 来替代SetForeGroundWindow。我会说你应该浏览所有的Windows Manipulation Api Functions,看看你是否遗漏了什么。

另外,请注意,您可以通过Process.Handle 属性获取System.Diagnostics.Process 对象的句柄。

【讨论】:

    【解决方案3】:

    SetForeGroundWindow 的替代品是 VisualBasic 的 AppActivate

    这样称呼

    Microsoft.VisualBasic.Interaction.AppActivate("WindowTitle")
    

    仅仅因为它位于 VisualBasic 命名空间中并不意味着您不能在 C# 中使用它。

    完整文档here

    【讨论】:

      【解决方案4】:

      您可以将 System.Diagnostics.Process Object 用于 FindWindow 等效项。目前没有 SetForegroundWindow 的等效项。您将希望将 Pinvoke 与 SetForgroundWindow 一起使用。

      [DllImport("user32.dll")]
      static extern bool SetForegroundWindow(IntPtr hWnd);
      

      【讨论】:

      • 这意味着我仍然需要处理 user32.dll 吗?没有其他选择听起来确实有点奇怪......
      猜你喜欢
      • 1970-01-01
      • 2021-11-08
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多