1

winapi を使用して単純なテキスト エディターを作成しようとしています。単純な文字では機能しますが、大文字やシフト キーでは機能しません。

char    keys[256];
int     x = 0;
while (1)
{
  for (x = 0; x <= 256; x++)
     {
        if (GetAsyncKeyState(x) == -32767)
           {
              char c[5];
              GetKeyboardState(keys);
              ToAscii(x, MapVirtualKey(x, 0), keys, c, 0);
              putchar(c[0]);
            }
      }
 }
4

3 に答える 3

1

GetAsyncKeyState は、おそらくここで使用する方法ではありません。テキスト エディター タイプ コントロールを作成する実際の方法は、代わりに WM_KEYDOWN および WM_CHAR メッセージを処理することです。HWND にフォーカスがある場合、Windows はこれらを WndProc に送信します。これは、Windows EDIT および RichEdit コントロールで使用される手法です。

WM_KEYDOWNを使用して、非文字キー (矢印 (VK_LEFT、VK_RIGHT)、ページアップなど) を処理します。テキスト文字にはWM_CHARを使用します。WM_KEYDOWN は、VK_ 値を使用して押されたキーを通知し、シフト状態を考慮しません。WM_CHAR はシフト状態を取るため、「A」対「a」または「1」対「!」が得られます。適切に。(これを行うには、メッセージ ループに TranslateMessage が必要であることに注意してください。)

そうは言っても、既存の Windows EDIT コントロールまたはRichEditコントロールを使用して作業を任せれば、さらに簡単で優れた方法になります。面白半分で遊んでいる場合を除き、車輪を再発明する正当な理由はほとんどありません。おそらくWin32を学んでいます。適切なテキスト エディターを作成するのは非常に複雑です。特に英語以外のテキストに入る場合は、考慮すべき多くの非自明なものがあります: 右から左へのテキスト (アラビア語、ヘブライ語) で正しく機能すること、使用されている IME で機能することを確認する必要があります。日本語と漢字を入力します。また、視覚障害のあるユーザーが引き続きコントロールを使用できるように、スクリーン リーダーがコントロールにアクセスできるようにする必要があります。EDIT と RichEdit がこれらすべてを行います。

たとえば、実際のメモ帳アプリは、EDIT コントロールの単なるラッパーです。WordPad は RichEdit コントロールをラップするだけです。どちらもコントロールにすべての難しい作業を任せ、追加の UI とファイルの保存/読み込み機能を上に追加するだけです。

于 2012-06-22T19:53:03.223 に答える
1

キーボード入力の動作は、あなたが思っているよりもはるかに複雑です。あなたの方法は次の理由で機能しません:

  1. GetAsyncKeyStateキーを見逃す可能性があります。ユーザーが通話の合間にキーを押すとどうなりますか?
  2. キーを押し続けるとどうなりますか?キーボードリピートはどうですか?
  3. 最も重要なのは、コードがキーと文字の間に 1 対 1 の関係を想定していることです。Shift / Caps Lock 状態やデッドキーなどの組み合わせを処理するメカニズムはありません。

自分が何をしようとしているのかを説明するように努めた方がよいでしょう。また、正しいアプローチ方法についてアドバイスを得ることができます。このような基本的な入力デバイスの動作を再発明しようとすることは、おそらく最善の方法ではありません。

于 2012-06-22T12:10:44.720 に答える
0

電話してみてください

GetKeyState(VK_CAPITAL); 

GetKeyboardState(keys);
于 2012-06-22T12:12:32.477 に答える