Как отключить звуковой сигнал при нажатии клавиши ENTER на однострочном элементе управления EDIT под Windows CE? - PullRequest
5 голосов
/ 28 августа 2010

Я занимаюсь разработкой приложения, ориентированного на устройство POCKET PC 2003 (Windows CE 4.2), использующее C ++ и собственный WINAPI (т.е. без MFC и т. П.). В нем у меня есть однострочный элемент управления для редактирования, какая часть главного окна ( не диалоговое окно); следовательно, нормальное поведение Windows при нажатии ENTER - ничего не делать, кроме звукового сигнала.

Я разделил процедуру окна на элемент управления редактирования, чтобы переопределить поведение по умолчанию, используя следующий код:


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 );
}

Это вызывает аналогичное поведение при нажатии кнопки «ОК».

Теперь к проблеме: эта оконная процедура не отменяет стандартное поведение при подаче звукового сигнала. Я подозреваю, что должно быть какое-то другое сообщение или сообщения, которые срабатывают при нажатии ENTER, которые мне не удается перехватить; Я просто не могу понять, какой. Я действительно хочу, чтобы устройство не издавало звуковых сигналов, поскольку оно портит другие звуки, которые воспроизводятся при определенных обстоятельствах при столкновении предметов, и крайне важно, чтобы пользователь был предупрежден об этом.

Заранее спасибо.

Ответы [ 5 ]

11 голосов
/ 28 августа 2010

После выброса всех сообщений в файл журнала мне наконец удалось выяснить, какое сообщение вызывало звуковой сигнал - WM_CHAR с wParam, установленным на VK_RETURN. Прекращение передачи этого сообщения в орган управления редактированием прекратило звуковой сигнал. ^^

Финальный код теперь звучит так:


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 голосов
/ 13 апреля 2015

У меня была такая же проблема, но с моим Rich Edit (с использованием также обратного обратного вызова). Эта сторона мне очень помогла, но, к сожалению, решение от gablin не сработало для меня. Каким-то образом я не смог получить VK_RETURN от WM_CHAR. Но из сообщения WM_KEYDOWN я могу :). Я также обнаружил, что в моем случае сигнал подается только в том случае, если расширенное редактирование использует стиль ES_MULTILINE. Итак, наконец, это мое рабочее решение в Callback, чтобы отключить звуковой сигнал, если нажата клавиша возврата. Может быть, это все еще может помочь кому-то, кто имеет ту же проблему:)

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 голос
/ 30 мая 2011

У меня была такая же проблема, но благодаря вам мне наконец-то удалось отключить звуковой сигнал.

// 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);
}

Я полагаю, хитрость заключалась в том, чтобы не допустить выполнения этих двух операторов

0 голосов
/ 04 апреля 2019

В настольном приложении Windows я также получал раздражающие звуковые сигналы при нажатии клавиши со стрелкой влево, когда точка вставки была слева от первого символа, или при нажатии клавиши со стрелкой вправо, когда точка вставки была расположена после последнего символа,Этот код обрабатывает клавишу возврата, а также клавиши со стрелками влево и вправо, чтобы остановить звуковой сигнал.

Это в настольном приложении Windows, поэтому я не слышу звуковой сигнал для WM_CHAR + VK_RETURN;вам придется самостоятельно попробовать этот код на CE, чтобы проверить, хорошо ли он работает для вас.

    bool processKeystroke = true;

    if (message == WM_CHAR || message == WM_KEYDOWN || message == WM_KEYUP) {

        DWORD start = 0;
        DWORD end = 0;
        switch (wParam) {

        case VK_RETURN:
            if ((GetWindowLong(hwnd, GWL_STYLE) & ~ES_MULTILINE)) {
                processKeystroke = false;
            }
            break;
        case VK_LEFT:
            {
                ::SendMessage(hwnd, EM_GETSEL, (WPARAM) &start, (LPARAM) &end);
                if (start == 0 && end == 0) {
                    processKeystroke = false;
                }
            }
            break;
        case VK_RIGHT:
            {
                LPARAM charCount = ::SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0);
                ::SendMessage(hwnd, EM_GETSEL, (WPARAM) &start, (LPARAM) &end);
                if (wParam == VK_RIGHT && start == charCount && end == charCount) {
                    processKeystroke = false;
                }
            }
            break;
        }

        if (processKeystroke) {
            lResult = DefSubclassProc(hwnd, message, wParam, lParam);
        }
    }
}
0 голосов
/ 28 августа 2010

Попробуйте также обработать WM_KEYUP и вернуть 0 для VK_RETURN, там же - Windows non-CE также подает звуковой сигнал, если вы не обрабатываете ключевое событие как вниз, так и вверх.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...