切换应用程序并将其分配给实例

本文关键字:分配 实例 应用程序 | 更新日期: 2023-09-27 18:34:11

我在切换应用程序并将它们分配给变量时遇到问题。这就是我目前所拥有的。

[DllImport("user32.dll")]
public static extern void SwitchToThisWindow(IntPtr hWnd, bool b);
Process[] procs = Process.GetProcessesByName("Excel");
foreach (Process proc in procs)
{
    SwitchToThisWindow(proc.MainWindowHandle, false);
}

最后,我想将该Excel窗口分配给xlApp。我试过了:
xlAppl = SwitchToThisWindow(proc.MainWindowHandle, false);但显然这不起作用,因为界面是空白的。我尝试查看GetActiveWindow我想获得活动窗口并分配它,但它的返回值不是对象,而是 IntPtr。有没有办法摆脱这种情况?

切换应用程序并将其分配给实例

关于您到目前为止所拥有的内容,我想指出几件事:

  1. 对于 SwitchToThisWindow MSDN 状态 - [此函数不适用于一般用途。它可能在后续版本的 Windows 中被更改或不可用。所以如果我是你,我个人不会用那个。
  2. 您的 Process.GetProcessByName 调用将返回所有 excel 进程。然后,您将尝试将每个内容带到前台。当然,只有最后一个实际上会出现在前景中,因为它们不可能都在前景中。您可能应该决定一种更准确的方式来选择您想要的。
  3. 您假设 MainWindowHandle 不是 IntPtr.Zero,这在所有情况下都不是有效的假设。MainWindowHandle 只有在呈现了可见窗口后才会具有一个值。

如果我是你,我会尝试使用 SetForegroundWindow 和 SetActiveWindow API。

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool SetForegroundWindow(
    IntPtr hWnd
    );
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SetActiveWindow(
    IntPtr hWnd
    );

伙计们,我找到了解决方案。如果其他人正在寻找这个,答案很简单:

Excel.Application xlApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");