关于替换wince 自带界面(Shell)的问题



               采用sunrain_hjb的方法,把wince 的explorer.exe 设置成最小,程序能够正常启动了,但是删除任务栏后,程序停留在一个地方不动了。后来恢复任务栏,采用如下的方式隐藏。

在platform.reg 加入

[HKEY_LOCAL_MACHINE\Software\Microsoft\Shell\AutoHide]
@="1"
[HKEY_LOCAL_MACHINE\Software\Microsoft\Shell\OnTop]
""=dword:0


但是很郁闷的是,启动后任务乱会显示那么一点点,相当的难看,纠结。咋回事呢。怎么办,删除也不行,隐藏也不行。


主要是不想改动程序了,再说排查程序原因很难排查, 还不如改任务栏代码了。

     继续整,目标是修改wince 任务栏代码。



       搞定了,把整个过程如下:

       目的:不删除explorer.exe,让explorer.exe正常启动,但是不能显示出来,因为显示出来很难看。要做到这样就要参考sunrain_hjb的方法:

C:\WINCE600\PUBLIC\SHELL\OAK\HPC\EXPLORER\MAIN\desktop.cpp

Code
bool CDesktopWnd::Create()
{

    IShellFolder    *pSHF;
    FOLDERSETTINGS fs;
    RECT rc;
    HRESULT hr = E_FAIL;
    
    // Get a shell folder for the desktop
    hr = SHGetDesktopFolder(
&pSHF);
    if(hr || !pSHF)
        goto Cleanup;

    // create a shell view for it
    hr = pSHF->CreateViewObject(NULL, IID_IShellView, (LPVOID *)
&_psv);
    if(hr || !_psv)
        goto Cleanup;

    fs.ViewMode = FVM_ICON;
    fs.fFlags = FWF_DESKTOP | FWF_ALIGNLEFT | FWF_NOSCROLL;

    //++changed by hjb
    //将Desktop的窗口大小设为0
 
   //SetRect(&rc, 0, 0, GetSystemMetrics(SM_CXVIRTUALSCREEN), GetSystemMetrics(SM_CYVIRTUALSCREEN));
    SetRect(&rc, 0, 0, 0, 0);
        //--changed by hjb
    
    // create the desktop's view window (no need to AddRef since CreateViewWindow does it)
    hr = _psv->CreateViewWindow(NULL,  &fs, (IShellBrowser *)this, &rc&_hWnd);
    if(hr || !_hWnd)
    {
        Release();
        goto Cleanup;
    }

    RegisterDesktop(_hWnd);

Cleanup:
    if(pSHF)
        pSHF->Release();

   return (hr == S_OK);    
}

    这样做,就看不见桌面的什么任何图标了,不过不要开心,该死的任务栏居然还在,在platform.reg 加入隐藏任务栏的设置

[HKEY_LOCAL_MACHINE\Software\Microsoft\Shell\AutoHide]
@="1"
[HKEY_LOCAL_MACHINE\Software\Microsoft\Shell\OnTop]
""=dword:0


     这里所谓的隐藏不是完全隐藏,为了响应触摸笔或者鼠标的事件来还原任务栏,微软默认在隐藏状态下任务栏是有点看得见的,这个非常不爽。我要完全看不见,屏幕一片黑才能达到我的要求,于是去看微软下的taskbar.cpp 代码

void CTaskBar::ResizeAppWindows(BOOL bTaskBarVisible, BOOL bTaskBarOnTop)
/*---------------------------------------------------------------------------*\
 *
\*---------------------------------------------------------------------------*/
{
    POINT pt[2]; // 0 - old size, 1 - new size
    RECT rc = {0};


    pt[1].x = GetSystemMetrics(SM_CXSCREEN);
    pt[1].y = GetSystemMetrics(SM_CYSCREEN);


    SystemParametersInfo(SPI_GETWORKAREA, 0, (void*)&rc, 0);


    pt[0].x = rc.right - rc.left;
    pt[0].y = rc.bottom - rc.top;


    if (bTaskBarOnTop)
    {
        if (bTaskBarVisible)
        {
            pt[1].y -= TASKBAR_HEIGHT;
        }
        else
        {
            pt[1].y -= TASKBAR_HEIGHT_AUTOHIDE;
           
        }
    }


    EnumWindows(s_ResizeCallBack, (LPARAM)pt);
} /* HHTaskBar_ResizeAppWindows()


      从代码看,这个任务栏隐藏的残留部分和TASKBAR_HEIGHT_AUTOHIDE有很大关系,在taskbar.hxx找到了TASKBAR_HEIGHT_AUTOHIDE的宏定义

#define TASKBAR_HEIGHT_AUTOHIDE 5

    现在把他改成

#define TASKBAR_HEIGHT_AUTOHIDE 0

   重新build and sysgen 改的部分,然后copy files to release directory ,最后make image,烧写下去就不出来了。

嘿嘿,当然

别忘记在platform.reg 加入你要用来做启动界面的exe 程序,如下:

     [HKEY_LOCAL_MACHINE\init]
   "Launch70"="\\NandFlash\\XXX.exe" 
   "Depend70"=hex:14,00,1e,00 


     exe 文件放在nandflash 盘符和SD卡盘符都能自动启动,这点倒是让我有点意外,以前网上说都是不行的,开始同事说行我还不信呢。

你可能感兴趣的:(wince应用程序开发)