2012-01-02 6 views
1

Сценарий У меня есть мое основное приложение, которое изначально было написано на Borland C++, которое запускается приложением C# .Net. Это основное приложение иногда открывает модальный диалог из процесса BRWSEXE. После появления модального диалогового окна вы можете случайно щелкнуть где-нибудь в главном приложении (не в диалоговом окне), в результате чего фокус будет кратковременно изменяться на основное приложение, отправляющее модальный диалог позади него в порядке Z. Но вы не можете на самом деле ничего делать в основном приложении, оно заблокировано этим модальным диалоговым окном, которое должно закрыться первым, прежде чем вы сможете продолжить.SetForegroundWindow не работает на Windows Server 2008

Проблема Использование приложения .net, который запускает все, что я могу искать примеры BRWSEXE, которые связаны с основным приложением и заставить их на первый план. Эта тактика работает безупречно везде, где я ее тестировал до сих пор (Windows XP, Windows 7, Windows Server 2003 R2), но она не работает на Windows Server 2008. Итак, насколько я могу судить, мой код отлично работает ... но что-то в этой среде отбрасывает.

Мой код

[DllImport("user32.dll")] 
static extern bool SetForegroundWindow(IntPtr hWnd); 

[DllImport("user32.dll")] 
static extern IntPtr AttachThreadInput(IntPtr idAttach, IntPtr idAttachTo, bool fAttach); 


private void PushBRWSEXEToFront() 
{ 
    //Make sure MyApplication is running 
    if (Process.GetProcessesByName("MyApplicationName").Length == 1) 
    { 
     Process[] brwsProc = Process.GetProcessesByName("BRWSEXE"); //Locate any processes for the browse dialog windows 
     for (int x = brwsProc.Length - 1; x > -1; x--) 
     { 
      //Make sure the browse window we are looking at is associated with the active program we are looking at 
      if (brwsProc[x].SessionId == Process.GetCurrentProcess().SessionId 
       || brwsProc[x].SessionId == Process.GetProcessesByName("MyApplicationName")[0].SessionId) 
      { 
       //attach to the main applications thread 
       AttachThreadInput(brwsProc[x].MainWindowHandle, Process.GetProcessesByName("MyApplicationName")[0].MainWindowHandle, true); 

       //Call Set foreground window to push the browse window in front of the rest of the program. 
       SetForegroundWindow(brwsProc[x].MainWindowHandle); 

       //Detach from the main thread 
       AttachThreadInput(brwsProc[x].MainWindowHandle, Process.GetProcessesByName("MyApplicationName")[0].MainWindowHandle, false); 
      } 
     } 
    } 
} 

ответ

3

Ваше объявление AttachThreadInput совершенно неверно. Он возвращает bool, аргументы uint. И вы используете это неправильно, вы должны передать идентификатор потока, а не дескриптор окна. Вам понадобится GetWindowThreadProcessId().

И вы вообще не проверяете ошибки, так что вы, очевидно, не можете диагностировать сбой. SetLastError требуется свойство, получить ошибку с Marshal.GetLastWin32Error(). Используйте pinvoke.net для получения более четких объявлений.

+0

Простите меня, я новичок, и у меня, должно быть, был плохой источник исходной информации. С учетом того, что вы сказали, это означает, что работают только мои вызовы SetForegroundWindow, так как он успешно выводит окно на передний план. Но ничто из этого не помогает мне понять, почему это работает где угодно, но на Windows Server 2008. Спасибо за информацию о получении ошибок от этих вызовов. Я обязательно буду использовать его, пока я продолжаю пытаться заставить это работать. – Hagelt18

+1

Звонок AttachThreadInput() существует по какой-либо причине. Без них SetForegroundWindow() имеет очень высокую вероятность того, что на самом деле не будет выводиться окно на передний план. –

0

Я использовал SwitchToThisWindow(), и хотя MSDN говорит, что она может быть удалена в будущих версиях Windows, он по-прежнему работает для меня.

+0

Работает ли она для минимизированных окон? – deadfish

+0

@ MichałMokrzycki Да, он должен показать и вывести окно на передний план. – scottm

+0

Спасибо за предложение! Я изменил свой код, чтобы использовать эту функцию, но я получаю те же результаты. Он работает с использованием других операционных систем, но не работает с Windows Server 2008. – Hagelt18

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