5


1

Windows CEで単一行のEDITコントロールでEnterキーを押したときにビープ音をオフにする方法

私は、C ++およびネイティブWINAPI(つまり、 MFCなどはありません)。 その中には、メインウィンドウのどの部分(ダイアログではない)の単一行編集コントロールがあります。したがって、Enterキーを押したときのWindowsの通常の動作は、ビープ音以外は何もしません。

次のコードを使用して、編集コントロールのウィンドウプロシージャをサブクラス化して、デフォルトの動作をオーバーライドしました。

LRESULT CALLBACK Gui::ItemIdInputProc( HWND hwnd, UINT message, WPARAM wParam,
    LPARAM lParam ) {

    switch ( message ) {
        case WM_KEYDOWN :
            switch ( wParam ) {
                case VK_RETURN :
                    addNewItem();
                    return 0;
            }
    }

    return CallWindowProc( oldItemIdInputProc_, hwnd, message, wParam, lParam );
}

これにより、「OK」ボタンを押すのと同じ動作が行われます。

ここで問題になります:このウィンドウプロシージャは、ビープ音を鳴らすデフォルトの動作をオーバーライドしません。 Enterキーを押したときにトリガーされる、キャプチャに失敗した他のメッセージが必要であると思われます。私はどちらが分からないのです。 アイテムの衝突が発生したときに特定の状況で再生される他の音が台無しになるので、デバイスのビープ音を止めたいです。ユーザーにそのことを知らせることが重要です。

前もって感謝します。

4 Answer


11


_all_メッセージをログファイルに吐き出した後、私は最終的にどのメッセージがビープ音の原因であるかを把握することができました。 そのメッセージがエディットコントロールに転送されるのを停止すると、ビープ音が停止しました。 ^^

最終的なコードは次のとおりです。

LRESULT CALLBACK Gui::ItemIdInputProc( HWND hwnd, UINT message, WPARAM wParam,
    LPARAM lParam ) {

    switch ( message ) {
        case WM_CHAR :
            switch ( wParam ) {
                case VK_RETURN :
                    addNewItem();
                    return 0;
            }
    }

    return CallWindowProc( oldItemIdInputProc_, hwnd, message, wParam, lParam );
}


2


私は同じ問題を抱えていましたが、Rich Edit(サブクラス化されたコールバックも使用)で問題が発生しました。 この面は私を大いに助けてくれましたが、残念ながらガブリンの解決策はうまくいきませんでした。 どういうわけか、WM_CHARからVK_RETURNを取得できませんでした。 ただし、WM_KEYDOWNメッセージからは次のことができます。 私の場合、リッチエディットがES_MULTILINEスタイルを使用しない場合にのみビープ音が鳴ることもわかりました。 最後に、これはリターンキーが押された場合にビープ音を無効にするコールバックの私の作業ソリューションです。 同じ問題を抱えている人を助けることができるかもしれません:)

switch (message){
        case (WM_KEYDOWN) : {
                switch (wParam) {
                case VK_RETURN:
                    if ((GetWindowLong(this_editbox->getHandle(), GWL_STYLE) & ~ES_MULTILINE)){ //Only dissable return key if the rich edit is a single line rich edit
                        //Do something you want to do here if return key was pressed for ex. delete text with SetWindowTextA(hRichEdit, "");     after reading
                        return 0;// stop beep by blocking message
                    }
                }
            break;
        }
        default: break;
}


1


同じ問題を抱えていたが、あなたのおかげで、ようやくビープ音を消すことができた。

// Run the message loop. It will run until GetMessage() returns 0
while(GetMessage (&messages, NULL, 0, 0)) {
  if(messages.message == WM_KEYDOWN && messages.wParam == VK_RETURN) {
    sendChatMessage("sample text");
    continue;
  }

  // Translate virtual-key messages into character messages
  TranslateMessage(&messages);

  // Send message to WindowProcedure
  DispatchMessage(&messages);
}

私はトリックがこれらの2つのステートメントを実行させないことだったと思います


0


WM_KEYUPも処理してみて、VK_RETURNに対しても0を返します - Windowsの非CEは、両方でキーイベントを処理しない場合もビープ音を鳴らします 上下。