1

ウィンドウをすべての前面に絶対に配置する質問がありますが、印刷ダイアログを起動すると、ウィンドウを前面に保持する方法が見つかりません。TopMost を実行している印刷ダイアログの上にウィンドウを保持する必要がありますが、タスクバーが表示されます隠されていますが。

それを最大化して全体的に配置するための私のフォームウィンドウのコード:

this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
this.TopMost = true;

印刷ダイアログを起動するコード:

PrinterSettings printerSettings = new PrinterSettings();
IntPtr hDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings);
IntPtr pDevMode = GlobalLock(hDevMode);
int sizeNeeded = DocumentProperties(IntPtr.Zero, IntPtr.Zero, printerSettings.PrinterName, IntPtr.Zero, pDevMode, 0);
IntPtr devModeData = Marshal.AllocHGlobal(sizeNeeded);

DocumentProperties(IntPtr.Zero, IntPtr.Zero, printerSettings.PrinterName, devModeData, pDevMode, 14);
// <--- Here the print dialog appears and the thread stops till I close the dialog

GlobalUnlock(hDevMode);
printerSettings.SetHdevmode(devModeData);
printerSettings.DefaultPageSettings.SetHdevmode(devModeData);
GlobalFree(hDevMode);
Marshal.FreeHGlobal(devModeData);

タスクバーを非表示にするコードは次のとおりです。

public class Taskbar
{
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern int FindWindow(string className, string windowText);

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern int ShowWindow(int hwnd, int command);

    private const int SW_HIDE = 0;
    private const int SW_SHOW = 1;

    public Taskbar()
    {
    }

    protected static int Handle
    {
        get
        {
            return FindWindow("Shell_TrayWnd", "");
        }
    }

    public static void Show()
    {
        ShowWindow(Handle, SW_SHOW);
    }

    public static void Hide()
    {
        ShowWindow(Handle, SW_HIDE);
    }
}

「this.TopMost = true;」の後にフォームで SetWinFullScreen を呼び出すこのコードも試しました。フォームを最大化しますが、どちらも機能しません:

public class WinApi
{
    [DllImport("user32.dll", EntryPoint = "GetSystemMetrics")]
    private static extern int GetSystemMetrics(int which);

    [DllImport("user32.dll")]
    private static extern void
        SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter,
                     int X, int Y, int width, int height, uint flags);        

    private const int SM_CXSCREEN = 0;
    private const int SM_CYSCREEN = 1;
    private static IntPtr HWND_TOP = IntPtr.Zero;
    private const int SWP_SHOWWINDOW = 64; // 0×0040

    public static int ScreenX
    {
        get { return GetSystemMetrics(SM_CXSCREEN);}
    }

    public static int ScreenY
    {
        get { return GetSystemMetrics(SM_CYSCREEN);}
    }

    public static void SetWinFullScreen(IntPtr hwnd)
    {
        SetWindowPos(hwnd, HWND_TOP, 0, 0, ScreenX, ScreenY, SWP_SHOWWINDOW);
    }
}

いずれの場合も、印刷ダイアログが起動されると、タスクバーが表示され、ユーザーはそれをクリックできます。

この印刷ダイアログをバックグラウンドで起動したり、フォームを絶対に (タスクバーやダイアログを表示せずに) 一番上に配置したりする方法はありますか?

編集済み: 問題は次の行にあります。

DocumentProperties(IntPtr.Zero, IntPtr.Zero, printerSettings.PrinterName, devModeData, pDevMode, 14);

この行は印刷ダイアログを起動し、タスクバーが表示されます (非表示または非表示)。

4

2 に答える 2

0

印刷ダイアログはフォームではなく、テキストボックスやコンボボックスのようにフォームから継承するコントロールです。したがって、最上位が適用されるとは思わないでください。以下の強調は私のものです。

最上位のフォームは、アクティブ フォームまたはフォアグラウンド フォームでなくても、他のすべての (最上位以外の) フォームに重なっているフォームです。最上位のフォームは常に、デスクトップ上のウィンドウの z オーダーの最高点に表示されます。このプロパティを使用して、検索と置換ツール ウィンドウなど、アプリケーションに常に表示されるフォームを作成できます。

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.topmost.aspx

于 2012-08-10T14:30:13.420 に答える
0

このリンクは、問題の解決策に近づくのに役立ちました: Hide Start Orb on Vista / Win 7 in C#

リンクの手順に従って、タスクバー クラスに追加します。

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr FindWindowEx(
           IntPtr parentHwnd,
           IntPtr childAfterHwnd,
           IntPtr className,
           string windowText);

public static void Show()
{
        ShowWindow(Handle, SW_SHOW);
        ShowWindow(FindWindowEx(IntPtr.Zero, IntPtr.Zero, (IntPtr)0xC017, null), SW_SHOW);
}

public static void Hide()
{
        ShowWindow(Handle, SW_HIDE);
        ShowWindow(FindWindowEx(IntPtr.Zero, IntPtr.Zero, (IntPtr)0xC017, null), SW_HIDE);
}

そして、TopMost を使用します。次に、ダイアログボックスが表示されたら、その瞬間を制御し、アプリケーションをすばやくフォーカスして「ポップアップ」の前に置きますが、今回はタスクバー/ウィンドウアイコンが表示されず、ユーザーは何もクリックできません。

完璧な解決策ではありませんが、私には有効です。

于 2012-08-17T02:19:09.970 に答える