4

我正在使用 C++ 和本机 WINAPI(即没有 MFC 等)开发针对 POCKET PC 2003(Windows CE 4.2)设备的应用程序。在其中我有一个单行编辑控件主窗口的哪个部分(不是对话框);因此,当按下 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 );
}

这会导致与按下“确定”按钮相同的行为。

现在到手头的问题:这个窗口过程不会覆盖发出哔声的默认行为。我怀疑必须有一些其他消息或在按下 ENTER 时触发的消息,但我无法捕获;我只是不知道是哪个。我真的很想阻止设备发出哔哔声,因为它会在发生项目碰撞时弄乱在某些情况下播放的其他声音,并且提醒用户这一点至关重要。

提前致谢。

4

6 回答 6

12

在将所有消息发送到日志文件后,我终于设法找出导致哔哔声的消息 -WM_CHAR设置wParamVK_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 );
}
于 2010-08-28T08:49:57.810 回答
2

我有同样的问题,但我的富编辑(也使用子类回调)。这方面帮助了我很多,但遗憾的是,gablin 的解决方案对我不起作用。不知何故,我无法从 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;
}
于 2015-04-12T22:37:23.860 回答
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);
}

我想诀窍是不要让执行这两个语句

于 2011-05-30T11:17:06.617 回答
0

也尝试处理 WM_KEYUP 并在那里为 VK_RETURN 返回 0 - 如果您不处理向下和向上的键事件,Windows 非 CE 也会发出哔哔声。

于 2010-08-27T22:41:25.420 回答
0

在 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);
        }
    }
}
于 2019-04-04T07:25:54.107 回答
0

在 Windows 桌面应用程序中,我在处理 WM_GETDLGCODE 中的 VK_TAB 时遇到了同样的问题。所以我找到了以下解决方案。

SystemParametersInfo(SPI_SETBEEP, FALSE, NULL, 0); // turn of the beep
// do somthing ... //
SystemParametersInfo(SPI_SETBEEP, TRUE, NULL, 0); // turn on the beep

于 2019-12-07T15:01:08.043 回答