gpt4 book ai didi

c# - SetForegroundWindow 仅在 visual studio 打开时有效

转载 作者:太空狗 更新时间:2023-10-29 17:30:39 28 4
gpt4 key购买 nike

我正在尝试使用 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 在 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();

关于c# - SetForegroundWindow 仅在 visual studio 打开时有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10740346/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com