所以这是一个常见的问题,并且已经在一些地方得到解决——虽然不是特定于 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; }
第二种方法会导致奇怪的无法解释的问题 - 这是我观察到的
如果我使用 JS 发送一个可编辑字段以聚焦,则会触发 Windows mobile
(si.fdwFlags == 0x00000003)
的MoveWindow()
SETTINGCHANGED (自动发生) - 可能是因为MoveWindow()
软键盘关闭并且窗口大小调整为全屏。调试后我看到打开软键盘时,收到的消息是先关闭的0x00000003
,然后0x00000002 (SIPF_DOCKED)
是关闭的。发生 #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 也不起作用 - 键盘覆盖可编辑字段(无窗口调整大小)并且窗口不再接受任何消息(挂起)