6

アプリケーションでは、タブレットで実行しているときにオンスクリーン キーボード (OSK) を使用しています。show メソッドと hide メソッドを持つ OSK というクラスを作成しました。

ユーザーがオンスクリーン キーボードで「Enter」を押すと、osk が非表示になります。問題は、ユーザーが閉じる (x) ボタンで OSK を閉じるときです。OSK は非表示になりますが、これが発生した場合は UI を変更する必要があります。

ユーザーが OSK の閉じるボタンを押したときを知る方法 (イベントなど) はありますか?

OSK の表示と非表示に使用したコードの一部を紹介します。示されているコードは Oxygene のものです (ただし、C# によく似ていると思います)。

まず、いくつかの dllImport があります。

[DllImport("user32.dll", SetLastError := true)]
class method PostMessage(hWnd: IntPtr; Msg: UInt32; wParam, lParam: IntPtr): Boolean; external;
[DllImport("user32.dll", SetLastError := true)]
class method FindWindow(lpClassName, lpWindowName: String): IntPtr; external; 

show メソッドには、次のコードがあります。

  using p := new Process do
  begin
    p.StartInfo.UseShellExecute := true;
    p.StartInfo.FileName := 'C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe';
    p.Start();
  end; 

Hide メソッドでは、次のコードを使用して OSK を非表示にします。

      var oskWindow := FindWindow("IPTip_Main_Window", nil);
      var WM_SYSCOMMAND  := 274;
      var SC_CLOSE := 61536;
      PostMessage(oskWindow, WM_SYSCOMMAND, SC_CLOSE, 0);

更新: Windows 7 で動作するソリューションが見つかりました....Windows 8 では動作しません (必要なもの)

これは、Windows 7 の問題を解決するために私が行ったことです。osk ウィンドウが表示されているかどうかが毎秒チェックされるようになりました。その場合、複数の場所で処理できるイベントが発生します。(osk が表示されるまでに時間がかかる場合があるため、タイマーで _firstshown ブール値もチェックします。

これが私が行った方法です: 最初に IsWindowVisible メソッドの dllImport を作成しました

[DllImport("user32.dll", CharSet:=CharSet.Auto)]
class method IsWindowVisible(hWnd:IntPtr):Boolean; external;

OSK.Show で、タイマーを開始し、_firstShown を false に設定します (OSK が表示されるまでに時間がかかるため) この前に、タイマー間隔を 1 秒に設定し、timer.Tick に eventhandlerf を追加しました:

  _timer.Interval := new TimeSpan(0,0,1);
  _timer.Tick += new EventHandler(_timer_Tick);

これは _timer_tick のコードです。

class method OSK._timer_Tick(sender: Object; e: EventArgs);
begin
  var oskWindow := FindWindow("IPTip_Main_Window", nil);
  var IsOSKOpen := IsWindowVisible(oskWindow);

  if not _firstShown then begin
      if IsOSKOpen then _firstShown := true;

      exit;
  end;
  if not IsOSKOpen then begin        
      OSKClosed(nil,new EventArgs());      
      _timer.Stop();
      _firstShown := false;
  end;
end;

これが私の開発マシン(Windows 7)で機能したときは喜びがありましたが、タブレット(Windows 8)でテストしたときは機能しなかったため、喜びは短命でした. タイマーなどは正常に動作しますが、Windows 8 は iswindowVisible メソッドを処理していないようです。

とにかく、すべての助けは非常に高く評価されています

4

4 に答える 4

0

プロセスがoskを開始するときにタイマーを開始できます。そのタイマーで確認できます

var oskprocess = Process.GetProcessesByName("osk");

oskprocess.Length=0の場合

その後、oskは実行されていません。その後、タイマーを停止できます

于 2015-07-13T09:05:03.330 に答える