我正在尝试使用 c# 将进程窗口设置为前台/焦点(来自一个在执行此操作时没有焦点的应用程序),因此我使用的是 user32.dllstatic 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 但它不会被突出显示,static extern bool ShowWindow(IntPtr hWnd, IntPtr status);
即使项目关闭,其他 win32 功能也能正常工作。
这个问题的任何解决方案或提示?
编辑: 我阅读了该功能的注释,我认为我的应用程序没有焦点,所以我尝试了这个:
[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 项目交互。说真的,我不明白。