2013-08-05 4 views
0

У меня есть элемент управления ActiveX, написанный на C#, который управляет сканером из браузера с использованием WIA. Все работает отлично, за исключением того, что WIA CommonDialog появляется под окном браузера. Как я могу заставить его отображаться поверх браузера?Как сделать диалоговое окно ActiveX Internet Explorer видимым

wiaDialog = new WIA.CommonDialog(); 
wiaImage = wiaDialog.ShowAcquireImage(WiaDeviceType.ScannerDeviceType, WiaImageIntent.UnspecifiedIntent, WiaImageBias.MaximizeQuality,        wiaFormatJPEG, false, false, false); 

[Редактировать]

Большое спасибо к Noseratio за поставив меня на правильный путь. Предложение использовать BringWindowToTop, вызванное с помощью таймера перед появлением диалогового окна, не совсем работает. Вместо этого используется функция SetForegroundWindow. Код выглядит следующим образом (вызывается из System.Timer.Timer до открытия диалогового окна сканирования):

public static void scanDialogToTop(Object caller, EventArgs theArgs) { 
    scanner.theTimer.Stop(); 
    foreach (Process p in Process.GetProcesses()) { 
     if (p.MainWindowTitle.StartsWith("Scan using")) { 
      SetForegroundWindow(p.MainWindowHandle); 
      break; 
     } 
    } 
} 

См this article для более полного обсуждения.

ответ

1

Не похоже, что вы можете указать родительское окно для ShowAcquireImage. Если заголовок всплывающего окна является статическим, вы можете использовать FindWindow, чтобы найти дескриптор всплывающего окна. Если ShowAcquireImage является блокирующим вызовом (не возвращается до закрытия всплывающего окна), перед его вызовом вам нужно настроить таймер и вызвать FindWindow при событии таймера. Я также подозреваю, что всплывающее окно WIA создается в другом потоке (вы можете проверить это со Spy ++). Если это так, вы можете использовать following hack, чтобы получить фокус всплывающего окна WIA. В противном случае вы просто делаете BringWindowToTop.