因此,這是一個普遍的問題,並已在一些地方解決 - 沒有具體的HTML控件在Windows Mobile 6.1專業,雖然。的Windows Mobile 6.1 - 調整大小HTMLControl時對軟鍵盤顯示窗口/隱藏
因此,這裏是我的問題
- 一個
WC_HTML
HTML控件作爲一款Windows Mobile應用程序窗口的子窗口中創建。 - HTML控制供應以可編輯的字段的HTML頁面。
- 當整個頁面充滿了可編輯的字段和用戶使用軟鍵盤,在頁面底部的領域,軟鍵盤覆蓋了幾個領域。
我絕對錯過了基於軟鍵盤打開/隱藏事件的窗口大小。
我想已經什麼
第一種方法 - 使用創建父容器窗口前,然後將其傳遞到的WndProc的WM_SETTINGCHANGE和WM_ACTIVATE方法被初始化全局聲明
SHACTIVATEINFO sai;
對象(如解釋here)。這沒有預期的效果。我嘗試了兩種方法 - 傳遞父HWND(推薦)以及Web控件的HWND - 沒有任何反應。
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的SETTINGCHANGED被觸發
(si.fdwFlags == 0x00000003)
集中爲其MoveWindow()
通話由調整窗口大小,以較小的可視區域(鍵盤來後向上),並有觸發(自動發生)另一條消息 - 可能是因爲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控件HWND不工作,要麼 - 鍵盤覆蓋可編輯字段(無窗調整大小)和窗口不接受任何更多的消息(掛)