我有这样的情况。 我有一个应用程序的窗口句柄。我需要激活它。我尝试了所有这些功能,但总是不能正常工作。(大多数时候,它不能在第一次工作,我将不得不手动点击它来激活它。第二次尝试以后它工作正常) 我这样做的原因是因为我在表单的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);
答案 0 :(得分:4)
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 :(得分:3)
您需要使用Window title之类的东西找到窗口,然后按如下方式激活它:
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
}
}
}
答案 2 :(得分:0)
您必须使用FromHandle获取表单:
f = Control.FromHandle(handle)
然后你可以在结果上调用Activate:
f.Activate()