したがって、これは一般的な問題であり、いくつかの場所で対処されていますが、Windows Mobile 6.1 Professional の 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;
2番目のアプローチ
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; }
この2番目のアプローチは、説明できない奇妙な問題を引き起こします-これが私が観察したことです
JS を使用して編集可能なフィールドの 1 つをフォーカスするように送信した場合、Windows モバイルの SETTINGCHANGED がトリガーされ、(キーボードが表示された後) ウィンドウのサイズをより小さい表示領域に変更する
(si.fdwFlags == 0x00000003)
ためのMoveWindow()
呼び出しが行われ、別のメッセージがトリガーされます。 (自動的に発生します) - が原因である可能性がMoveWindow()
あり、ソフト キーボードが閉じて、ウィンドウが全画面にサイズ変更されます。デバッグ後、ソフト キーボードを開くと、受信したメッセージが最初に表示され0x00000003
、次に0x00000002 (SIPF_DOCKED)
閉じるメッセージが表示されることがわかりました。#1 が発生した後、タッチ スクリーンからフィールドをクリックできない (フィールドにフォーカスできない) 場合がありますが、方向パッドまたはソフト キーボードの矢印キーを使用してフィールドに移動できます。したがって、これは、キーボードが強調表示されてから自動的に非表示になる問題 #1 が原因で発生する大きな問題です。ボタンを使用して強制的にソフト キーボードを引き上げることはできますが (変更により、自動切り替え機能が失われるようです)。
以前にこの問題に直面したことがありますか?HTMLControl for Windows Mobile 6.1 Professional を使用したすべての人が同じ問題を経験したに違いないことを願っています。
更新 - 2011 年 3 月 22 日-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 の両方に対して - キーボードが編集可能なフィールドをオーバーレイし (ウィンドウのサイズ変更なし)、ウィンドウはそれ以上のメッセージを受け入れません (ハング)