2010-09-24 2 views
2

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

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

+1 Конечно, гуру Windows Raymond Chen [говорит, что это может заставить ваше приложение замораживаться] (http://stackoverflow.com/a/8081858/15639) – MarkJ

+1

Где вы берете mainThreadId и что это значит? Благодаря! –

0

Вы должны получить форму с помощью FromHandle:

f = Control.FromHandle(handle) 

, то вы можете можете вызвать Activate на результат:

f.Activate() 
+1

Проблема в том, что он работает только для элементов управления в одном приложении. Чтобы активировать окно в другом процессе, вам нужно использовать функции PInvoke. – TheCodeKing

3

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

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 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^