需要激活一个窗口

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,它是什么意思?谢谢!

以上是关于需要激活一个窗口的主要内容,如果未能解决你的问题,请参考以下文章

microsoft office 2010过期了,怎么办

Windows7多窗口显示排列技巧

Window10专业版 激活

浏览器如何暂停/更改JavaScript时选项卡或窗口未激活?

有窗口在激活时激活前一个窗口吗?

关于激活Bentley软件详细步骤介绍