我正在尝试使用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项目进行任何交互。说实话,我不明白。