我有一个问题要把我的窗户放在所有的前面,但是当我启动一个打印对话框时,我无法找到把我的窗口放在前面:我必须把我的窗口放在打印对话框上做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);
}
}
我尝试了这段代码,在&#34; this.TopMost = true;&#34;之后也在我的表单中调用了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);
此行启动打印对话框,然后出现任务栏(隐藏或不隐藏)。
答案 0 :(得分:0)
打印对话框不是表单,它是从表单继承的控件,如textbox和combobox。所以你不应该期望最顶层的申请。下面的重点是我的。
最上面的表单是一个重叠所有其他表单(非最顶层)的表单 表格即使它不是活动形式或前景形式。最顶层的形式 始终显示在z顺序的最高点 桌面上的窗户。您可以使用此属性来创建表单 它总是显示在您的应用程序中,例如Find和 替换工具窗口。
http://msdn.microsoft.com/en-us/library/system.windows.forms.form.topmost.aspx
答案 1 :(得分: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。然后当出现对话框时,我控制片刻并快速聚焦我的应用程序放在“弹出窗口”前面,但这次没有显示任务栏/窗口图标,用户无法点击任何内容。
不是完美的解决方案,但它对我有效。