Сценарий У меня есть мое основное приложение, которое изначально было написано на 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);
}
}
}
}
Простите меня, я новичок, и у меня, должно быть, был плохой источник исходной информации. С учетом того, что вы сказали, это означает, что работают только мои вызовы SetForegroundWindow, так как он успешно выводит окно на передний план. Но ничто из этого не помогает мне понять, почему это работает где угодно, но на Windows Server 2008. Спасибо за информацию о получении ошибок от этих вызовов. Я обязательно буду использовать его, пока я продолжаю пытаться заставить это работать. – Hagelt18
Звонок AttachThreadInput() существует по какой-либо причине. Без них SetForegroundWindow() имеет очень высокую вероятность того, что на самом деле не будет выводиться окно на передний план. –