在WIN MOBILE中,常常要全屏显示某个窗体,但是如果通过"SHFullScreen"方法,最大只能扩大到工作区,任务栏与菜单栏依旧还在,需要隐藏这两个栏。处理方法是先Find再Hide,如要恢复则Find再Show,在每次操作后,均需要MoveWindow调整工作窗体。
MS_SIPBUTTON:下方中间的拼字那个窗口
menu_worker:下方的带颜色的长条,不算中间的拼字
HHTaskBar:上方的任务条
[DllImport("CoreDll.dll", SetLastError = true)]
public static extern IntPtr FindWindow(string className, string WindowsName);
[DllImport("coredll.dll", EntryPoint = "EnableWindow")]
public static extern bool EnableWindow(IntPtr hwnd, bool bEnable);
[DllImport("coredll.dll", EntryPoint = "ShowWindow")]
public static extern bool ShowWindow(IntPtr hwnd, bool bEnable);
[DllImport("coredll.dll")]
private static extern IntPtr ShowWindow(IntPtr hWnd, int _value);
[DllImport("aygshell.dll")]
public static extern bool SHFullScreen(IntPtr hWnd, uint dwState);
[DllImport("coredll.dll", SetLastError = true)]
public static extern bool EnumWindows(IntPtr lpEnumFunc, uint lParam);
[DllImport("coredll.dll")]
public static extern void GetClassName(IntPtr hwnd,StringBuilder s, int nMaxCount);
public const int SW_SHOW = 5; //显示窗口常量
public const int SW_HIDE = 0; //隐藏窗口常量
1. 先使用FindWindow找到某窗体的句柄,然后使用ShowWindow来控制窗体的显示与隐藏。只能控制一个窗体
2. 先使用EnumWindows枚举所有的窗体句柄,然后使用GetClassName获取某一个句柄对应窗体的名字,再使用ShowWindow来控制窗体的显示与隐藏。可以控制所有窗体
隐藏任务栏
1. 使用FindWindw+ShowWindow
2. SHFullScreen
CRect rc;
SetRect( &rc, 0, 0, GetSystemMetrics( SM_CXSCREEN ), GetSystemMetrics( SM_CYSCREEN ) );
MoveWindow( rc );
隐藏菜单栏
使用FindWindw+ShowWindow
在很多时候,我们仅需要隐藏任务栏,而对下方的输入法栏并不需要隐藏,如手机QQ的做法.但是在这个时候,弹出输入法软键盘的时候,屏幕上窗口将会自动向下收缩并露出上方被隐藏任务栏的区域.解决方法是在主窗口里响应 WM_WININICHANGE 消息即可,不需要在里面添加自定义代码,如下:
// 按动输入法时不自动弹出任务栏
void CMainFrame::OnWinIniChange(LPCTSTR lpszSection)
{
CFrameWnd::OnWinIniChange(lpszSection);
// TODO: 在此处添加消息处理程序代码
}
SHFullScreen的使用
public static bool FullScreen(IntPtr hWnd, bool isFull)
{
uint dwState = 0;
if (isFull)
{
dwState = SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON;
}
else
{
dwState = SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON | SHFS_SHOWSTARTICON;
}
return SHFullScreen(hWnd, dwState);
}
const uint SHFS_SHOWTASKBAR = 0x1;//任务栏
const uint SHFS_HIDETASKBAR = 0x2;
const uint SHFS_SHOWSIPBUTTON = 0x4;//输入法
const uint SHFS_HIDESIPBUTTON = 0x8;
const uint SHFS_SHOWSTARTICON = 0x10;//开始菜单栏
const uint SHFS_HIDESTARTICON = 0x20;
这种方法隐藏任务栏,在程序退出的时候不需要做什么特殊处理.但是在对 CWnd, CFrameWnd 一类的窗口做处理的时候一定要先 SetForegroundWindow 一次,而 CDialog 类型的窗口则不需要这一步.
另外在对 CWnd, CFrameWnd 类型窗口做处理的时候,还必须响应 WM_ACTIVATE 消息,在其中做同样的处理才能做到完全的隐藏任务栏效果.
由于此消息在程序退出及窗口切换的时候也被调用,因此直接在其中响应消息,会导致程序退出之后任务栏的刷新问题,及程序窗口无法切出.解决办法是设置成员变量判断程序是否退出,并检测此消息的参数来判断是否切换窗口.相关代码如下:
void CMainFrame::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CFrameWnd::OnActivate(nState, pWndOther, bMinimized);
if( !nState && !pWndOther )
return;
if( !m_bExit )
{
// 全屏窗口
SetForegroundWindow();
DWORD dwState = ( SHFS_HIDETASKBAR | SHFS_HIDESTARTICON | SHFS_HIDESIPBUTTON );
::SHFullScreen( m_hWnd, dwState );
CRect rc;
SetRect( &rc, 0, 0, GetSystemMetrics( SM_CXSCREEN ), GetSystemMetrics( SM_CYSCREEN ) );
MoveWindow( rc );
}
}