2

私は C++ で Windows Mobile 用に開発していますが、問題が発生しています。ウィンドウ クラスを追加し、その中にキーボード入力をWndProc実装しました。問題は、間違ったコードを取得していて、func キーなどのキーを間違って識別していることです。さらに悪いことに、取得している値 (メッセージwParamの) が、WM_KEYDOWNここにある 2 台の電話の間で異なる値になっていることです。テスト用 - 他の電話で何が起こるかは誰にもわかりません。

何年も遊んだ後、定義済みの「EDIT」クラスからウィンドウを作成するだけで、実際に入力が正しく取得されることがわかりました(文字/キーに関して)。

したがって、問題は電話ではなく、メッセージを取得するモードにあるはずです (win32 の初心者で、知識がなくてすみません)。入力モードをいじってみましたが、EM_NUMBERS などを使用してウィンドウにメッセージを送信すると、常に失敗しました。

だから私がやりたいことは(私は提案を受け付けていますが)、どういうわけか隠し編集ウィンドウから文字を取得し、それらを私のウィンドウに転送することです。(ただし、ウィンドウにフォーカスを当てる必要があるため、異なるメッセージに正しく反応するWM_KEYDOWNなど)

これを行う方法はありますか?

この問題について私が質問するのはこれで 3 回目です。これまでに助けようとしたすべての人に永遠に感謝しています (ただし、私の問題を解決できた場合はさらに感謝します)。

関連するコードの抜粋は次のとおりです。

履修登録 :

WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW;  
wc.lpfnWndProc = WndProc;  
wc.cbClsExtra = 0;  
wc.cbWndExtra = 0;  
wc.hInstance = hInstance;  
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ROADMAP));  
wc.hCursor = 0;  
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);  
wc.lpszMenuName = 0;  
wc.lpszClassName = szWindowClass;  

window creation  
if (width == -1) width = CW_USEDEFAULT;  
if (height == -1) height = CW_USEDEFAULT;  
RoadMapMainWindow = CreateWindow(g_szWindowClass, szTitle, OVERLAPPEDWINDOW,  
                                 CW_USEDEFAULT, CW_USEDEFAULT, width, height, 
                                 NULL, NULL, g_hInst, NULL);  

MessageLoop  
// Main message loop:  
while (GetMessage(&msg, NULL, 0, 0))  
{
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))  
    {  
        TranslateMessage(&msg);  
        DispatchMessage(&msg);    
    }  
}  

WNDPROC の抜粋:

case WM_KEYDOWN:  
{  
    WORD Code = (WORD)wParam;  
    int iRepeatTimes = (lParam & 0x0000FFFF);  
    int iScanCode = (lParam & 0x00FF0000) >> 16;  
    BOOL bALT_IsDown = (lParam & 0x20000000)? TRUE: FALSE;  
    BOOL bAlreadyPressed= (lParam & 0x40000000)? TRUE: FALSE;  
    BOOL bNowReleased = (lParam & 0x80000000)? TRUE: FALSE;  
    return DefWindowProc(hWnd, message, wParam, lParam);  
}  
4

3 に答える 3

2

の wParamWM_KEYDOWNは仮想キー コードであり、ASCII (または Unicode) 文字であることに実際には制約されていません。プラットフォーム上でキーを一意に識別する単純なコードです。

「テキスト」が必要な場合 (メッセージを待ちたい場合WM_CHAR) の wParam はWM_CHAR、ユーザーが入力した実際の文字値になります。


詳細情報 - アプリケーション ループ内 (呼び出し先) では、メッセージを見つけて合成し、対応するメッセージを投稿するTranslateMessageのが実際の仕事です。TranslateMessageWM_KEYDOWNWM_CHAR


TranslateAccelerator投稿されたメッセージを妨害できる唯一のもののようです。もちろん、Windows メッセージ プロシージャがDefWindowProc間違ったタイミングでメッセージを渡している (または渡していない) 場合、非常に異常な動作が現れることがあります。DefWindowProcたとえば、WM_KEYDOWNハンドラーに明示的な呼び出しがあるのはなぜですか? これを正しく処理する最も簡単な方法はDefWindowProc、window proc の最後の処理として、処理済みおよび未処理のすべてのメッセージがデフォルトでそこに移動するようにすることです。DefWindowProc例外的なケースは、メッセージの取得を防止したいメッセージです (たとえば、メッセージWM_PAINTを処理する場合)。


また、使用しようとしていることに言及し続けますEdit_SetInputMode-Edit_SetInputModeメッセージをウィンドウに送信します: EM_SETINPUTMODE-これは、EDITコントロールによってのみ理解されるメッセージです。独自のウィンドウ クラスを登録したので、'EM_SETINPUTMODE' は何もしません。

于 2009-11-11T18:09:20.087 に答える
0

推測しているだけですが、おそらくあなたのアプリはAnsiアプリですか?それはおそらく、異なるコードページがあなたに異なるキーコードを与えることを説明するかもしれません。では、プロジェクト設定ですべてUnicodeにして、それに応じて文字列定数を定義しようとしましたか?そして、本当に基本的なアプリを作るためにctackeの提案を試しましたか?

于 2009-12-15T12:04:35.327 に答える
0

あなたが説明したような問題はありませんでしたので、これを再現する最低限のコードセットを見たいと思っています。一部の電話機では偽のユーザー範囲メッセージが表示されることが知られていますが、これらは現在のレベルでは影響を受けないはずです。非常に基本的なものに対して間違ったコードを取得しているという事実は、ウィンドウ作成またはメッセージ処理コードに何か問題があるに違いないことを示しています。

于 2009-11-11T16:42:55.077 に答える