1

WIAShowTransferメソッドを使用して、WPF アプリケーション内からデバイスから画像をスキャンします。ただし、ユーザーは WPF アプリケーションにフォーカスを設定することができ、WIA によって表示されるプログレス バーは WPF アプリケーションの背後に隠れます。プログレスバーをすべての上に表示させるにはどうすればよいですか?

4

2 に答える 2

1

実行中のすべてのプロセスを列挙する、WPF アプリケーションですべてのウィンドウを列挙するなど、いくつかのことを試しましたが、うまくいきませんでした。これが最終的に助けになったものです:

#region Force Scan Progress to front hack

[DllImport("user32.dll", EntryPoint = "EnumDesktopWindows", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumDelegate lpEnumCallbackFunction, IntPtr lParam);

[DllImport("user32.dll", EntryPoint = "GetWindowText", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
private static extern int _GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount);

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool IsWindowVisible(IntPtr hWnd);

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

const int MAXTITLE = 255;

private delegate bool EnumDelegate(IntPtr hWnd, int lParam);

public static string GetWindowText(IntPtr hWnd)
{
    StringBuilder strbTitle = new StringBuilder(MAXTITLE);
    int nLength = _GetWindowText(hWnd, strbTitle, strbTitle.Capacity + 1);
    strbTitle.Length = nLength;
    return strbTitle.ToString();
}

private static bool EnumWindowsProc(IntPtr hWnd, int lParam)
{
    string strTitle = GetWindowText(hWnd);
    if (strTitle.StartsWith("Title of progress bar")) SetForegroundWindow(hWnd);
    return true;
}

private void forceScanProgressToFront(object source, EventArgs ea)
{
    EnumDelegate delEnumfunc = new EnumDelegate(EnumWindowsProc);
    bool bSuccessful = EnumDesktopWindows(IntPtr.Zero, delEnumfunc, IntPtr.Zero);
    if (!bSuccessful)
    {
        // Get the last Win32 error code
        int nErrorCode = Marshal.GetLastWin32Error();
        string strErrMsg = String.Format("EnumDesktopWindows failed with code {0}.", nErrorCode);
        throw new Exception(strErrMsg);
    }
}

#endregion

DispatcherTimerこれを500ms ごとに起動する にバインドします。したがって、ユーザーがプログレス バーを非表示にしようとしても、500 ミリ秒ごとにポップアップします。

参照: http://hintdesk.com/how-to-enumerate-all-opened-windows/

于 2013-04-26T12:23:12.700 に答える