0

したがって、これは一般的な問題であり、いくつかの場所で対処されていますが、Windows Mobile 6.1 Professional の HTML コントロールに固有のものではありません。

だからここに私の問題があります

  • WC_HTMLWindows 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番目のアプローチは、説明できない奇妙な問題を引き起こします-これが私が観察したことです

  1. JS を使用して編集可能なフィールドの 1 つをフォーカスするように送信した場合、Windows モバイルの SETTINGCHANGED がトリガーされ、(キーボードが表示された後) ウィンドウのサイズをより小さい表示領域に変更する(si.fdwFlags == 0x00000003)ためのMoveWindow()呼び出しが行われ、別のメッセージがトリガーされます。 (自動的に発生します) - が原因である可能性がMoveWindow()あり、ソフト キーボードが閉じて、ウィンドウが全画面にサイズ変更されます。デバッグ後、ソフト キーボードを開くと、受信したメッセージが最初に表示され0x00000003、次に0x00000002 (SIPF_DOCKED)閉じるメッセージが表示されることがわかりました。

  2. #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 の両方に対して - キーボードが編集可能なフィールドをオーバーレイし (ウィンドウのサイズ変更なし)、ウィンドウはそれ以上のメッセージを受け入れません (ハング)

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) 1 ページの透明 PNG を挿入する 電話に物理キーボードがない場合は、表示する各 HTML の最後に「1 ページの透明 PNG」を挿入してください。HTML は別の場所から作成されているため、ほとんどの人がこれを行うことができないことを私は知っています。しかし、これは私がやったことであり、現在は機能しています。これは、別の方法で発生していたハングの問題を解決するためだけのものです。これにより、コンテンツを気にせずにすべてのページにスクロールバーが表示されます。欠点は、ユーザーが下部の空のスペースをスクロールできることです (ただし、何も影響しません)。

ps - これは幸運な発見であり、なぜ MS にこのような不完全なバグがあるのか​​よくわかりません。より長い HTML バージョンでアプリをテストしている間、常に機能し、実際のテストでは機能しませんでした。最後に空のPNGを試してみたところ、うまくいきました。:)

于 2011-08-24T05:51:42.550 に答える