Windows Mobile 6.5 如何实现全屏,关闭输入法?

AIRFLYNET 2010-03-21 12:32:42
Windows Mobile 6.5 如何实现全屏,关闭输入法?
...全文
1830 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
terryxiezan 2010-07-08
  • 打赏
  • 举报
回复

重载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);

避免从其它窗口切回来后,界面不再全屏。如按拨号键。
zxdlms 2010-06-28
  • 打赏
  • 举报
回复
Mark一下。
ACDINO 2010-06-25
  • 打赏
  • 举报
回复
学习ing
烂番 2010-03-23
  • 打赏
  • 举报
回复
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()一下,因为窗体被隐藏再显示时,输入法按钮又会跑出来了
AIRFLYNET 2010-03-22
  • 打赏
  • 举报
回复
我之前用了以下方法,在 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;
}
}
Jake_Lin 2010-03-22
  • 打赏
  • 举报
回复
我这个程序用到全屏,希望对你有用。
Windows Mobile下GPS管理软件NavsGo之GPS监控功能的开发
gengzhen_2005 2010-03-22
  • 打赏
  • 举报
回复
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);
}

gengzhen_2005 2010-03-22
  • 打赏
  • 举报
回复
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);
}

reflower 2010-03-22
  • 打赏
  • 举报
回复
重载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);
小李匪盗 2010-03-21
  • 打赏
  • 举报
回复
http://www.devdiv.net/bbs/viewthread.php?tid=10734

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧