需要激活一个窗口
Posted
技术标签:
【中文标题】需要激活一个窗口【英文标题】:Need to activate a window 【发布时间】:2011-04-16 18:26:39 【问题描述】:我有这样的情况。 我有一个应用程序的窗口句柄。我需要激活它。我尝试了所有这些功能,但并不总是有效。(大多数时候,它第一次不起作用,我必须手动单击它来激活它。第二次尝试之后它工作正常) 我这样做的原因是因为我在我需要执行的表单的 Form.Activate 事件中编写了代码。 应用程序是单实例应用程序。创建新实例时,它首先检查是否存在任何其他进程,如果找到,则将旧进程的句柄传递给这些函数,以便用户可以在旧窗体上工作。 应用程序是从不同的 C 应用程序调用的。 [DllImport("user32.dll")] public static extern int ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")]
public static extern int SetForegroundWindow(IntPtr hWnd);
[DllImport("user32")]
public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam);
【问题讨论】:
【参考方案1】:您必须使用 FromHandle 获取表单:
f = Control.FromHandle(handle)
然后您可以在结果上调用 Activate:
f.Activate()
【讨论】:
这个问题是它只适用于同一应用程序中的控件。要在另一个进程中激活窗口,您需要使用 PInvoke 函数。【参考方案2】:您需要使用窗口标题之类的内容找到窗口,然后按如下方式将其激活:
public class Win32 : IWin32
//Import the FindWindow API to find our window
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindowNative(string className, string windowName);
//Import the SetForeground API to activate it
[DllImport("User32.dll", EntryPoint = "SetForegroundWindow")]
private static extern IntPtr SetForegroundWindowNative(IntPtr hWnd);
public IntPtr FindWindow(string className, string windowName)
return FindWindowNative(className, windowName);
public IntPtr SetForegroundWindow(IntPtr hWnd)
return SetForegroundWindowNative(hWnd);
public class SomeClass
public void Activate(string title)
//Find the window, using the Window Title
IntPtr hWnd = win32.FindWindow(null, title);
if (hWnd.ToInt32() > 0) //If found
win32.SetForegroundWindow(hWnd); //Activate it
【讨论】:
【参考方案3】:SetForgroundWindow 仅在其进程具有输入焦点时才有效。这是我使用的:
public static void forceSetForegroundWindow( IntPtr hWnd, IntPtr mainThreadId )
IntPtr foregroundThreadID = GetWindowThreadProcessId( GetForegroundWindow(), IntPtr.Zero );
if ( foregroundThreadID != mainThreadId )
AttachThreadInput( mainThreadId, foregroundThreadID, true );
SetForegroundWindow( hWnd );
AttachThreadInput( mainThreadId, foregroundThreadID, false );
else
SetForegroundWindow( hWnd );
【讨论】:
+1 当然是 Windows 大师 Raymond Chen says this can cause your app to freeze 你在哪里取 mainThreadId,它是什么意思?谢谢!以上是关于需要激活一个窗口的主要内容,如果未能解决你的问题,请参考以下文章