当前位置:编程学习 > wap >>

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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,