none
WM_CHARやUIElement.TextInputの代わりになるAPIについて RRS feed

  • 質問

  • 以下の機能を持ったエディターコンポーネントを作っています

    • シンタックスハイライト
    • 矩形選択
    • ルーラーと行番号の表示
    • 折り畳み

    日本語の入力はITextStoreACP2を実装することで可能になったのですが、IMEをOFFにしている状態で文字を入力することができません。キーボードを押すとKeyDownイベントが飛んでくるのでキーコードを文字列変換するクラスでも作ろうと思ったのですが、非常に数が多いのでやりたくありませんし、様々なキー配列があることを考えるとこれではまずいような気がします。MSDNでWM_CHARやUIElement.TextInputに代わるイベントを探すとCoreWindow.CharacterReceivedというイベントが見つかりました。これで解決するのかと思っていたのですが、このイベントで送られてくるデーターはCharacterReceivedEventArgsクラスのインスタンスで、このクラスには入力された文字を格納するプロパティはありませんでした。その代わりにKeyCodeプロパティがあったのですが、これは仮想キーコードなので求めているものとは違うように思います。WM_CHARに相当するイベントがあったら教えてほしいです


    • 編集済み jbh03215 2013年6月3日 12:33
    2013年6月3日 12:17

回答

  • 試してないので、わかりませんが、CharacterReceivedEventArgs のリファレンスをみると、KeyStatus の内容が、WM_CHAR の LPARAMに相当するものとほとんど同じ(というか、見せ方変えてるだけで全く一緒に見える)で、KeyCode は WPARAM に相当する内容のように読み取れます。

    一度、ハンドリングしてみて、どんな値が来るか確認してみてはいかがでしょう?


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答としてマーク jbh03215 2013年6月3日 13:50
    2013年6月3日 12:55

すべての返信

  • 試してないので、わかりませんが、CharacterReceivedEventArgs のリファレンスをみると、KeyStatus の内容が、WM_CHAR の LPARAMに相当するものとほとんど同じ(というか、見せ方変えてるだけで全く一緒に見える)で、KeyCode は WPARAM に相当する内容のように読み取れます。

    一度、ハンドリングしてみて、どんな値が来るか確認してみてはいかがでしょう?


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答としてマーク jbh03215 2013年6月3日 13:50
    2013年6月3日 12:55
  • WM_CHARと同じということで試しにハンドリングしてみました。aを入力すると97が飛んできて、これをChar.ConvertFromUtf32()で変換してみると文字を取得することができました。

    なぜか、uintで飛んでくるのが釈然としませんが、どうやらこれで臨む動作が実現できました。ありがとうございました

    2013年6月3日 13:50