SetForegroundWindow仅在Visual Studio打开时工作

本文关键字:工作 Studio 仅在 Visual SetForegroundWindow | 更新日期: 2023-09-27 18:35:10

我正在尝试使用 c# 将进程窗口设置为前台/焦点(来自当时没有焦点的应用程序),因此我使用的是 user32.dll static extern bool SetForegroundWindow(IntPtr hWnd) 方法:

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd); 
public void setFocus()
{
    SetForegroundWindow(process.MainWindowHandle);       
}

一切都运行良好,但前提是我打开了Visual Studio 2008,我甚至不需要从VS08启动应用程序,只需打开项目即可。关闭项目的那一刻,我的应用程序无法将另一个窗口设置为前台。唯一的结果是,在任务栏中,另一个窗口以蓝色突出显示。当我再次使用VS08打开我的项目时,它工作正常。

我一点也不知道为什么...我认为问题可能是他无法导入 dll,但随后它不会被突出显示,并且即使项目关闭,其他 win32 函数(如 static extern bool ShowWindow(IntPtr hWnd, IntPtr status);)也能正常工作。

这个问题有什么解决方案或提示吗?

编辑:我阅读了该函数的注释,我的想法是我的应用程序没有重点,所以我尝试了这个:

[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll")]
static extern bool AllowSetForegroundWindow(int procID);
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); 
public void setAUTFocus()
{
    IntPtr hWnd = GetForegroundWindow();
    uint processID = 0;
    uint threadID = GetWindowThreadProcessId(hWnd, out processID);
    int intID = (int)processID;
    AllowSetForegroundWindow(intID);
    SetForegroundWindow(process.MainWindowHandle); 
}        

现在,我正在寻找当前具有焦点的窗口进程,并为此窗口设置AllowSetForegroundWindow,并尝试现在将焦点设置在我的窗口上。但是同样的问题,当我在VS中打开项目时,它正在工作,如果没有,我只会在任务栏中获得蓝色突出显示。

在运行我的应用程序期间,我可以打开/关闭 vs 项目,当它打开时一切都在工作,当它关闭时它不起作用,我在运行我的应用程序时与 VS 项目没有交互。说真的,我不明白。

SetForegroundWindow仅在Visual Studio打开时工作

在互联网上搜索了几天后,我找到了一个可能的简单解决方案,使SetForegroundWindow在Windows 7上运行:在调用SetForegroundWindow之前按Alt键。

public static void ActivateWindow(IntPtr mainWindowHandle)
    {
        //check if already has focus
        if (mainWindowHandle == GetForegroundWindow())  return;
        //check if window is minimized
        if (IsIconic(mainWindowHandle))
        {
            ShowWindow(mainWindowHandle, Restore);
        }
        // Simulate a key press
        keybd_event((byte)ALT, 0x45, EXTENDEDKEY | 0, 0);
        //SetForegroundWindow(mainWindowHandle);
        // Simulate a key release
        keybd_event((byte)ALT, 0x45, EXTENDEDKEY | KEYUP, 0);
        SetForegroundWindow(mainWindowHandle);
    }

而win32api进口

  private const int ALT = 0xA4;
  private const int EXTENDEDKEY = 0x1;
  private const int KEYUP = 0x2;
  private const uint Restore = 9;
  [DllImport("user32.dll")]
  private static extern bool SetForegroundWindow(IntPtr hWnd);
  [DllImport("user32.dll")]
  private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);
  [DllImport("user32.dll")]
  [return: MarshalAs(UnmanagedType.Bool)]
  private static extern bool IsIconic(IntPtr hWnd);
  [DllImport("user32.dll")]
  private static extern int ShowWindow(IntPtr hWnd, uint Msg);
  [DllImport("user32.dll")]
  private static extern IntPtr GetForegroundWindow();

我在发送 Alt 键时遇到了问题,因为它在我选择 Enter 时强制打开窗口菜单(而不是我想要的确定按钮)。

这对我有用:

public static void ActivateWindow(IntPtr mainWindowHandle)
{
    //check if already has focus
    if (mainWindowHandle == GetForegroundWindow())  return;
    //check if window is minimized
    if (IsIconic(mainWindowHandle))
    {
        ShowWindow(mainWindowHandle, Restore);
    }
    // Simulate a key press
    keybd_event(0, 0, 0, 0);
    SetForegroundWindow(mainWindowHandle);
}