Нужно активировать окно - PullRequest
       35

Нужно активировать окно

3 голосов
/ 24 сентября 2010

У меня такая ситуация.У меня есть дескриптор окна приложения.Мне нужно активировать его.Я перепробовал все эти функции, но не всегда работает (в большинстве случаев он не работает в первый раз, и мне придется вручную нажимать на него, чтобы активировать. Вторая попытка работает нормально) Причина, по которой яЯ делаю это потому, что у меня есть код, написанный в событии 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);

Ответы [ 3 ]

4 голосов
/ 24 сентября 2010

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 );
}
3 голосов
/ 24 сентября 2010

Вам нужно найти окно, используя что-то вроде заголовка окна, а затем активировать его следующим образом:

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
        }
    }
}
0 голосов
/ 24 сентября 2010

Вы должны получить форму, используя FromHandle:

f = Control.FromHandle(handle)

тогда можно позвонить Активировать по результату:

 f.Activate()
...