我有一个用C#编写的ActiveX控件,它使用WIA从浏览器操作扫描程序。一切正常,除了WIA CommonDialog在浏览器窗口下弹出。如何让它显示在浏览器之上?
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 。
答案 0 :(得分:1)
看起来您不能为ShowAcquireImage
指定父窗口。如果弹出窗口的标题是静态的,您可以使用FindWindow来查找弹出窗口的句柄。如果ShowAcquireImage
是阻塞调用(在弹出窗口关闭之前不会返回),则在调用它之前,您需要设置一个计时器并在计时器事件时调用FindWindow
。我还怀疑WIA弹出窗口是在另一个线程上创建的(你可以用Spy ++检查)。如果是这种情况,您可以使用following hack来重点关注WIA弹出窗口。否则你只需BringWindowToTop。