Windows Mobile 6.5 如何实现全屏,关闭输入法?
Windows Mobile 6.5 如何实现全屏,关闭输入法? --------------------编程问答-------------------- http://www.devdiv.net/bbs/viewthread.php?tid=10734 --------------------编程问答-------------------- 我这个程序用到全屏,希望对你有用。Windows Mobile下GPS管理软件NavsGo之GPS监控功能的开发 --------------------编程问答-------------------- 重载virtual BOOL OnInitDialog()
{ m_bFullScreen = FALSE;
CDialog::OnInitDialog();
SHINITDLGINFO shidi;
shidi.dwMask = SHIDIM_FLAGS;
shidi.dwFlags = SHIDIF_SIZEDLGFULLSCREEN|SHIDIF_SIPDOWN;
shidi.hDlg = m_hWnd;
::SHInitDialog(&shidi);
} --------------------编程问答-------------------- windowsXP
void CTaskBarDlg::OnHide()
{
// TODO: Add your control notification handler code here
FindWindow("Shell_TrayWnd",NULL)->ShowWindow(SW_HIDE);
}
void CTaskBarDlg::OnShow()
{
FindWindow("Shell_TrayWnd",NULL)->ShowWindow(SW_SHOW);
}
winCE
void CTaskBarDlg::OnHide()
{
// TODO: Add your control notification handler code here
FindWindow(_T("HHTaskBar"),NULL)->ShowWindow(SW_HIDE);
}
void CTaskBarDlg::OnShow()
{
FindWindow(_T("HHTaskBar"),NULL)->ShowWindow(SW_SHOW);
}
CE的系统任务栏是在explorer.cpp中创建的,代码如下:
如果想去掉任务栏,注释掉这段代码即可
/*
// fork off a thread for the taskbar
hTaskbarSyncEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (!hTaskbarSyncEvent)
{
goto Cleanup;
}
hThread = CreateThread(NULL, NULL, CreateTaskBar, &hTaskbarSyncEvent, 0, NULL);
WaitForSingleObject(hTaskbarSyncEvent, INFINITE);
// GetExitCodeThread(); // Test for failure?
CloseHandle(hThread);
CloseHandle(hTaskbarSyncEvent);
*/
任务栏的各项属性在\WINCE500\PUBLIC\SHELL\OAK\HPC\EXPLORER\INC\taskbar.hxx中定义如下:
高度为26,隐藏高度为5:
#define TASKBAR_HEIGHT 26
#define TASKBAR_HEIGHT_AUTOHIDE 5
.隐藏taskbar的几种方法:
1全屏时隐藏,退出全屏时显示,在这种情况下可以先Findwindow(“HHTASKBAR”),然后用movewindow移出全屏范围之外,需要时再移入
2一直隐藏(就是从系统起来之后就不希望看到taskbar),可以通过Findwindow,和showwindow来实现,也可以通过修改 taskbar.cpp(public/shell/oak/hpc/explorer/taskbar/)中的CTaskBar::Register函 数,让其直接返回true
3动态显示和隐藏,可以修改platform.reg文件
HKEY_LOCAL_MACHINE\Software \Microsoft\Shell\AutoHide("default"=dword:1)和HKEY_LOCAL_MACHINE\Software \Microsoft\Shell\OnTop("default"=dword:0)以及 HKEY_LOCAL_MACHINE\Software\Microsoft\Shell\SlideTaskBar("default"=dword:0)
/*************************************************************************************************************************/
动态设置系统任务栏是否在最前端
/*************************************************************************************************************************/
在文件 \WINCE500\PUBLIC\SHELL\OAK\HPC\EXPLORER\TASKBAR\taskbar.cpp中
WCHAR const c_szShellOnTop[] = L"Software\\Microsoft\\Shell\\OnTop";
void CTaskBar::SaveOnTop(BOOL bOnTop)
/*---------------------------------------------------------------------------*\
*
\*---------------------------------------------------------------------------*/
{
LONG lRet;
HKEY hkey;
DWORD dw;
lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, c_szShellOnTop,
0, KEY_ALL_ACCESS, &hkey);
if (lRet != ERROR_SUCCESS)
{
lRet = RegCreateKeyEx(HKEY_LOCAL_MACHINE, c_szShellOnTop,
0, NULL, 0, KEY_ALL_ACCESS,
NULL, &hkey, &dw);
}
if (lRet == ERROR_SUCCESS)
{
RegSetValueEx(hkey, L"", 0, REG_DWORD, (LPBYTE)&bOnTop, sizeof(DWORD));
RegCloseKey(hkey);
}
}
/* SaveOnTop() */
void CTaskBar::WinIniChange(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// ......
// 代码省略
switch(lParam)
{
case INI_INTL:
{
HKL hklCurrent = InputLang_t::GetInputLocale();
InputLang_t::InitializeInputLangList();
UpdateInputLangIcon(hklCurrent);
m_fLocaleChange = TRUE;
break;
}
case 5000:
ReloadSettings();
break;
default:
break;
}
}
由此可以想到给系统任务栏发消息改变任务栏的状态:
设置系统任务栏最前端显示代码:
HWND hWnd = ::FindWindow(_T("HHTaskBar"), NULL);
SaveOnTop(1);
::SendMessage(hWnd, WM_SETTINGCHANGE, (WPARAM) 0, 5000);
设置系统任务栏不再最前端显示代码:
HWND hWnd = ::FindWindow(_T("HHTaskBar"), NULL);
SaveOnTop(0);
::SendMessage(hWnd, WM_SETTINGCHANGE, (WPARAM) 0, 5000);
我个人的总结:
要实现全屏显示,需要隐藏命令栏和任务栏
1,在OnInitDialog()函数中实现如下代码,
先要隐藏命令栏:
// 隐藏命令栏,命令栏是屏幕最下边的一条
HWND hWnd = SHFindMenuBar(m_hWnd);
::CommandBar_Show(hWnd, FALSE);
// SHFullScreen fails if dialog box is not foreground.
//如果对话框不在最前面,那么SHFullScreen()函数会失败
SetForegroundWindow();
// 隐藏任务栏,任务栏是屏幕最上边的一条
SHFullScreen(m_hWnd, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON|SHFS_HIDESTARTICON);
// Resize the window over the taskbar area.
CRect rcScreen;
rcScreen.SetRect( 0,
0,
GetSystemMetrics( SM_CXSCREEN ),
GetSystemMetrics( SM_CYSCREEN ));
MoveWindow(&rcScreen, TRUE);
// 隐藏输入面板
SIPINFO si;
memset(&si, 0, sizeof(SIPINFO));
si.cbSize = sizeof(SIPINFO);
SHSipInfo(SPI_GETSIPINFO, 0, &si, 0);
if (si.fdwFlags & SIPF_ON)
{
si.cbSize = sizeof(SIPINFO);
si.fdwFlags = SIPF_OFF;
SHSipInfo(SPI_SETSIPINFO, 0, &si, 0);
}
--------------------编程问答-------------------- windowsXP
void CTaskBarDlg::OnHide()
{
// TODO: Add your control notification handler code here
FindWindow("Shell_TrayWnd",NULL)->ShowWindow(SW_HIDE);
}
void CTaskBarDlg::OnShow()
{
FindWindow("Shell_TrayWnd",NULL)->ShowWindow(SW_SHOW);
}
winCE
void CTaskBarDlg::OnHide()
{
// TODO: Add your control notification handler code here
FindWindow(_T("HHTaskBar"),NULL)->ShowWindow(SW_HIDE);
}
void CTaskBarDlg::OnShow()
{
FindWindow(_T("HHTaskBar"),NULL)->ShowWindow(SW_SHOW);
}
CE的系统任务栏是在explorer.cpp中创建的,代码如下:
如果想去掉任务栏,注释掉这段代码即可
/*
// fork off a thread for the taskbar
hTaskbarSyncEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (!hTaskbarSyncEvent)
{
goto Cleanup;
}
hThread = CreateThread(NULL, NULL, CreateTaskBar, &hTaskbarSyncEvent, 0, NULL);
WaitForSingleObject(hTaskbarSyncEvent, INFINITE);
// GetExitCodeThread(); // Test for failure?
CloseHandle(hThread);
CloseHandle(hTaskbarSyncEvent);
*/
任务栏的各项属性在\WINCE500\PUBLIC\SHELL\OAK\HPC\EXPLORER\INC\taskbar.hxx中定义如下:
高度为26,隐藏高度为5:
#define TASKBAR_HEIGHT 26
#define TASKBAR_HEIGHT_AUTOHIDE 5
.隐藏taskbar的几种方法:
1全屏时隐藏,退出全屏时显示,在这种情况下可以先Findwindow(“HHTASKBAR”),然后用movewindow移出全屏范围之外,需要时再移入
2一直隐藏(就是从系统起来之后就不希望看到taskbar),可以通过Findwindow,和showwindow来实现,也可以通过修改 taskbar.cpp(public/shell/oak/hpc/explorer/taskbar/)中的CTaskBar::Register函 数,让其直接返回true
3动态显示和隐藏,可以修改platform.reg文件
HKEY_LOCAL_MACHINE\Software \Microsoft\Shell\AutoHide("default"=dword:1)和HKEY_LOCAL_MACHINE\Software \Microsoft\Shell\OnTop("default"=dword:0)以及 HKEY_LOCAL_MACHINE\Software\Microsoft\Shell\SlideTaskBar("default"=dword:0)
/*************************************************************************************************************************/
动态设置系统任务栏是否在最前端
/*************************************************************************************************************************/
在文件 \WINCE500\PUBLIC\SHELL\OAK\HPC\EXPLORER\TASKBAR\taskbar.cpp中
WCHAR const c_szShellOnTop[] = L"Software\\Microsoft\\Shell\\OnTop";
void CTaskBar::SaveOnTop(BOOL bOnTop)
/*---------------------------------------------------------------------------*\
*
\*---------------------------------------------------------------------------*/
{
LONG lRet;
HKEY hkey;
DWORD dw;
lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, c_szShellOnTop,
0, KEY_ALL_ACCESS, &hkey);
if (lRet != ERROR_SUCCESS)
{
lRet = RegCreateKeyEx(HKEY_LOCAL_MACHINE, c_szShellOnTop,
0, NULL, 0, KEY_ALL_ACCESS,
NULL, &hkey, &dw);
}
if (lRet == ERROR_SUCCESS)
{
RegSetValueEx(hkey, L"", 0, REG_DWORD, (LPBYTE)&bOnTop, sizeof(DWORD));
RegCloseKey(hkey);
}
}
/* SaveOnTop() */
void CTaskBar::WinIniChange(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// ......
// 代码省略
switch(lParam)
{
case INI_INTL:
{
HKL hklCurrent = InputLang_t::GetInputLocale();
InputLang_t::InitializeInputLangList();
UpdateInputLangIcon(hklCurrent);
m_fLocaleChange = TRUE;
break;
}
case 5000:
ReloadSettings();
break;
default:
break;
}
}
由此可以想到给系统任务栏发消息改变任务栏的状态:
设置系统任务栏最前端显示代码:
HWND hWnd = ::FindWindow(_T("HHTaskBar"), NULL);
SaveOnTop(1);
::SendMessage(hWnd, WM_SETTINGCHANGE, (WPARAM) 0, 5000);
设置系统任务栏不再最前端显示代码:
HWND hWnd = ::FindWindow(_T("HHTaskBar"), NULL);
SaveOnTop(0);
::SendMessage(hWnd, WM_SETTINGCHANGE, (WPARAM) 0, 5000);
我个人的总结:
要实现全屏显示,需要隐藏命令栏和任务栏
1,在OnInitDialog()函数中实现如下代码,
先要隐藏命令栏:
// 隐藏命令栏,命令栏是屏幕最下边的一条
HWND hWnd = SHFindMenuBar(m_hWnd);
::CommandBar_Show(hWnd, FALSE);
// SHFullScreen fails if dialog box is not foreground.
//如果对话框不在最前面,那么SHFullScreen()函数会失败
SetForegroundWindow();
// 隐藏任务栏,任务栏是屏幕最上边的一条
SHFullScreen(m_hWnd, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON|SHFS_HIDESTARTICON);
// Resize the window over the taskbar area.
CRect rcScreen;
rcScreen.SetRect( 0,
0,
GetSystemMetrics( SM_CXSCREEN ),
GetSystemMetrics( SM_CYSCREEN ));
MoveWindow(&rcScreen, TRUE);
// 隐藏输入面板
SIPINFO si;
memset(&si, 0, sizeof(SIPINFO));
si.cbSize = sizeof(SIPINFO);
SHSipInfo(SPI_GETSIPINFO, 0, &si, 0);
if (si.fdwFlags & SIPF_ON)
{
si.cbSize = sizeof(SIPINFO);
si.fdwFlags = SIPF_OFF;
SHSipInfo(SPI_SETSIPINFO, 0, &si, 0);
}
--------------------编程问答-------------------- 我之前用了以下方法,在 CE 下可以, 但在 WINDOWS Mobile 6.5下却失效了。
void CWMSApp::ToggleFullScreen(BOOL mode)
{
HWND hWndInputPanel = NULL; // The SIP
HWND hWndTaskBar = NULL; // The TaskBar
HWND hWndSipButton = NULL; // The SIP Button
hWndInputPanel = FindWindow(TEXT("SipWndClass"), NULL);
hWndSipButton = FindWindow(TEXT("MS_SIPBUTTON"), NULL);
hWndTaskBar = FindWindow(TEXT("HHTaskBar"), NULL);
if (mode)
{
if(hWndTaskBar != NULL)
ShowWindow(hWndTaskBar, SW_SHOW);
//if(hWndInputPanel != NULL)
//ShowWindow(hWndInputPanel, SW_SHOW);
//Never forcibly show the input panel
if(hWndSipButton != NULL)
ShowWindow(hWndSipButton, SW_SHOW);
//if(SystemParametersInfo(SPI_GETWORKAREA, 0, &rtDesktop, NULL) == 1)
// SetWindowPos(hWnd,HWND_TOPMOST,0,0,rtDesktop.right -
//rtDesktop.left,rtDesktop.bottom - rtDesktop.top, SWP_SHOWWINDOW);
mode = false;
}
else
{
if (hWndTaskBar != NULL) ShowWindow(hWndTaskBar, SW_HIDE);
if (hWndInputPanel != NULL) ShowWindow(hWndInputPanel, SW_HIDE);
if (hWndSipButton != NULL) ShowWindow(hWndSipButton, SW_HIDE);
//SetWindowPos(hWnd,HWND_TOPMOST,0,0,GetSystemMetrics(SM_CXSCREEN),
// GetSystemMetrics(SM_CYSCREEN), SWP_SHOWWINDOW);
mode = true;
}
} --------------------编程问答-------------------- WM的:
//隐藏输入法按钮,状态栏(开始菜单所在的那一条),开始菜单按钮
SHFullScreen(hWnd, SHFS_HIDETASKBAR | SHFS_HIDESTARTICON | SHFS_HIDESIPBUTTON);
MoveWindow(hWnd, 0,0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), FALSE);
创建窗体时, CreateWindowEx ( WS_EX_TOPMOST, 。。。就始终最前了
不然,需要在窗体ACtive时,再SHFullScreen()一下,因为窗体被隐藏再显示时,输入法按钮又会跑出来了 --------------------编程问答-------------------- 学习ing
--------------------编程问答-------------------- Mark一下。 --------------------编程问答--------------------
重载OnInitDialog()
{
m_bFullScreen = FALSE;
CDialog::OnInitDialog();
SetForegroundWindow();
SHINITDLGINFO shidi;
shidi.hDlg = m_hWnd;
shidi.dwMask = SHIDIM_FLAGS;
shidi.dwFlags = SHIDIF_FULLSCREENNOMENUBAR;
::SHInitDialog(&shidi);
SHFullScreen(m_hWnd, SHFS_HIDESIPBUTTON);
SHFullScreen(m_hWnd,SHFS_HIDETASKBAR);
SHFullScreen(m_hWnd,SHFS_HIDESTARTICON);
RECT rect;
SetRect(&rect, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
MoveWindow(&rect, TRUE);
}
还有在重载OnActive,OnSize
加入
SHFullScreen(m_hWnd, SHFS_HIDESIPBUTTON);
SHFullScreen(m_hWnd,SHFS_HIDETASKBAR);
SHFullScreen(m_hWnd,SHFS_HIDESTARTICON);
避免从其它窗口切回来后,界面不再全屏。如按拨号键。
补充:移动开发 , Windows Phone