0

所以这是一个常见的问题,并且已经在一些地方得到解决——虽然不是特定于 Windows Mobile 6.1 专业版上的 HTML 控件。

所以这是我的问题

  • WC_HTML作为 Windows Mobile 应用程序窗口的子窗口创建 的HTML 控件。
  • HTML 控件提供带有可编辑字段的 html 页面。
  • 当整个页面充满可编辑字段并且用户正在使用软键盘时,对于页面底部的字段,软键盘会覆盖一些字段。

我肯定错过的是根据软键盘打开/隐藏事件调整窗口大小。

我已经尝试过的

  • 第一种方法- 使用在创建父容器窗口之前初始化的全局声明SHACTIVATEINFO sai;对象,然后将其传递给 WndProc 的 WM_SETTINGCHANGE 和 WM_ACTIVATE 方法(如此所述)。这没有预期的效果。我已经尝试过 - 传递父 HWND(如推荐)和 Web 控件的 HWND - 没有任何反应。

    case WM_ACTIVATE: SHHandleWMActivate(hWnd, wParam, lParam, &sai, 0); break;

    case WM_SETTINGCHANGE: SHHandleWMSettingChange(hWnd, wParam, lParam, &sai); break;

  • 第二种方法- 还尝试根据键盘事件手动调整窗口大小,方法是使用检查事件SIPINFO si;,然后使用si.fdwFlags确定软键盘是否被隐藏

    case WM_SETTINGCHANGE: {
           SIPINFO si;
           switch( wParam ) 
           {
               case SPI_SETSIPINFO: {
               memset( &si, 0, sizeof( si ) );
               si.cbSize = sizeof( si );
               if( SHSipInfo( SPI_GETSIPINFO, 0, &si, 0 ) ) {
                   RECT rcMenuBar;
                   // Get the size of the menu bar
                   GetWindowRect(g_hWndMenuBar, &rcMenuBar);
                   // Keyboard opens up
                   if(si.fdwFlags == 0x00000003) { 
                       MoveWindow(webControlHWND, 0, 0, (si.rcVisibleDesktop.right - si.rcVisibleDesktop.left), (si.rcVisibleDesktop.bottom - si.rcVisibleDesktop.top), TRUE);          
                   } else if(si.fdwFlags == SIPF_DOCKED) { 
                         // keyboard closes down - weird that this msg comes when keyboard is closed instead of SIPF_OFF
                         // visible area above menu bar
                         si.rcVisibleDesktop.bottom -= (rcMenuBar.bottom - rcMenuBar.top);
                         MoveWindow(webControlHWND, 0, 0, (si.rcVisibleDesktop.right - si.rcVisibleDesktop.left), (si.rcVisibleDesktop.bottom - si.rcVisibleDesktop.top), TRUE);            
                   }
                }
             break;
           }
         }
    break;
    }
    

第二种方法会导致奇怪的无法解释的问题 - 这是我观察到的

  1. 如果我使用 JS 发送一个可编辑字段以聚焦,则会触发 Windows mobile(si.fdwFlags == 0x00000003)MoveWindow()SETTINGCHANGED (自动发生) - 可能是因为MoveWindow()软键盘关闭并且窗口大小调整为全屏。调试后我看到打开软键盘时,收到的消息是先关闭的0x00000003,然后0x00000002 (SIPF_DOCKED)是关闭的。

  2. 发生 #1 后,有时无法从触摸屏单击该字段(无法专注于该字段),但可以使用方向键或软键盘箭头键导航到该字段。因此,这是由于问题#1 导致键盘突出显示然后自动隐藏的一个大问题。虽然我可以使用按钮强行拉起软键盘(自动切换功能似乎因更改而丢失)。

以前有人遇到过这个问题吗?我希望每个使用过 HTMLControl for Windows Mobile 6.1 专业版的人都遇到过同样的问题。

更新 - 22Mar2011-11:27AM 在这里,我的父窗口不处理 WM_SETFOCUS 或 WM_KILLFOCUS 方法,而是子 HTML 控件 (WC_HTML) 可能会处理它们。这里的担心是父窗口 HWND 的消息循环获取需要转换到子窗口的 WM_SETTINGSCHANGE 消息。我还尝试完全像 HandleSIP Windows Mobile SDK 示例那样做,每次收到消息时都有SHACTIVATEINFO对象- 不像以前它是全局存储的,并且在创建窗口之前或在 memset()memset()WM_CREATE

case WM_CREATE : {
    memset(&sai, 0, sizeof(SHACTIVATEINFO));
    break;
}
case WM_ACTIVATE:
    if (SPI_SETSIPINFO == wParam){
        memset(&sai, 0, sizeof(SHACTIVATEINFO));
        SHHandleWMActivate(webControlHWND, wParam, lParam, &sai, 0);
    }
    break;
case WM_SETTINGCHANGE: {
    if (SPI_SETSIPINFO == wParam){
        memset(&sai, 0, sizeof(SHACTIVATEINFO));
        SHHandleWMSettingChange(webControlHWND, wParam, lParam, &sai);
    }
    break;
}

针对父窗口和 HTML Control HWND 也不起作用 - 键盘覆盖可编辑字段(无窗口调整大小)并且窗口不再接受任何消息(挂起)

4

1 回答 1

0

所以我实际上找到了解决这个问题的方法。Windows Mobile 中存在一些蹩脚的错误,如果屏幕不包含 HTML < 1 页面,则会挂起屏幕。所以最终的解决方案是

WM_SETTINGCHANGE1)只在手机没有物理键盘时才坚持处理消息。如果有,那么我会让我的软键盘与可见字段重叠。请注意,如果设备有物理键盘,软键盘默认不会弹出,除非明确显示,并且在此之后保留该行为。

case WM_SETTINGCHANGE: {
   SIPINFO si;
   switch( wParam ) 
   {
       case SPI_SETSIPINFO: {
       memset( &si, 0, sizeof( si ) );
       si.cbSize = sizeof( si );
       if( SHSipInfo( SPI_GETSIPINFO, 0, &si, 0 ) ) {
           RECT rcMenuBar;
           // Get the size of the menu bar
           GetWindowRect(g_hWndMenuBar, &rcMenuBar);
           // Keyboard opens up
           if(si.fdwFlags == 0x00000003) { 
           } else if(si.fdwFlags == SIPF_DOCKED || si.fdwFlags==10) { 
                 // keyboard closes down - weird that this msg comes when keyboard is closed instead of SIPF_OFF
                 // visible area above menu bar
                 si.rcVisibleDesktop.bottom -= (rcMenuBar.bottom - rcMenuBar.top);
           }
           MoveWindow(webControlHWND, 0, 0, (si.rcVisibleDesktop.right - si.rcVisibleDesktop.left), (si.rcVisibleDesktop.bottom - si.rcVisibleDesktop.top), TRUE);          

        }
     break;
   }
 }
 break;
 }

2) 注入一页长的透明PNG 如果手机没有物理键盘,则确保在每个要显示的HTML 末尾注入一个“透明的一页长PNG”。我知道大多数人不能这样做,因为 HTML 来自其他地方。但这就是我所做的,现在可以了。这只是为了摆脱以其他方式发生的挂起问题。这将确保所有页面都有滚动条而不会打扰内容。缺点是用户可以滚动底部的空白区域(尽管不会影响任何内容)。

ps - 这是一个幸运的发现,我也不知道为什么 MS 有这样一个蹩脚的错误。当我用更长的 HTML 版本测试我的应用程序时,它总是可以工作,而我的真实测试却没有。那时我最后尝试了空的 PNG,它确实有效。:)

于 2011-08-24T05:51:42.550 回答