Win32 API:如何在Edit控件中捕获转义键?

高天使

我发现,由于某些未知原因,当焦点位于Edit控件中时,Escape键永远不会产生消息。下面是创建父窗口并在其上方编辑控件的代码MyCallBckProcedure()中,我将printf()放在* WM_COMMAND *下,以捕获由Edit产生的消息更重要的是-我什至试图打印MyCallBckProcedure()捕获的所有消息但是如果专注于Edit,则转义键永远不会产生任何消息。这里可能有什么奇怪的问题?

#include <iostream>
#include <windows.h>
#include <stdio.h>

#define IDC_MAIN_EDIT 101

LRESULT __stdcall MyCallBckProcedure( HWND window, unsigned msg, WPARAM wp, LPARAM lp ){
    printf("%x ",msg);
    switch(msg){
        case WM_COMMAND://here should be catched the escape key of Edit
            printf("%x ",msg);
            break;
        case WM_KEYDOWN:
            printf("%x ",msg);
            if(wp == VK_ESCAPE)PostQuitMessage(0);
            break;
        case WM_DESTROY:
            std::cout << "\ndestroying window\n" ;
            PostQuitMessage(0);
            return 0;
        default:
            return DefWindowProc( window, msg, wp, lp ) ;

        break;
        case WM_SIZE:{
            HWND hEdit;
            RECT rcClient;

            GetClientRect(window, &rcClient);

            hEdit = GetDlgItem(window, IDC_MAIN_EDIT);
            SetWindowPos(hEdit, NULL, 0, 0, rcClient.right, rcClient.bottom, SWP_NOZORDER);
        }
        break;
    }
}

int main(){
    const char* const myclass = "myclass";
    WNDCLASSEX wndclass = { sizeof(WNDCLASSEX), CS_DBLCLKS, MyCallBckProcedure,
                            0, 0, GetModuleHandle(0), LoadIcon(0,IDI_APPLICATION),
                            LoadCursor(0,IDC_ARROW), HBRUSH(COLOR_WINDOW+1),
                            0, myclass, LoadIcon(0,IDI_APPLICATION) };
    if(RegisterClassEx(&wndclass)<0){
        printf("ERR: in registering window class\n");
        return 1;
    }
    //Creating window
    HWND window = CreateWindowEx( 0, myclass, "title",
                   WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
                   CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, GetModuleHandle(0), 0 );
    if(!window){
        printf("ERR: in creating window\n");
        return 1;
    }
    ShowWindow( window, SW_SHOWDEFAULT );
    MSG msg;
    //creating TextBox on the window
    HFONT hfDefault;
    HWND hEdit;
    hEdit = CreateWindowEx(0, "edit", "", 
        WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        window, (HMENU)IDC_MAIN_EDIT, GetModuleHandle(NULL), NULL);
    if(hEdit == NULL){
        MessageBox(window, "Could not create edit box.", "Error", MB_OK | MB_ICONERROR);
        return 1;
    }
    hfDefault = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
    SendMessage(hEdit, WM_SETFONT, (WPARAM)hfDefault, MAKELPARAM(FALSE, 0));
    //Now resize TextBox to fill whole parent window
    RECT RectSize;
    GetClientRect(window,&RectSize);
    hEdit = GetDlgItem(window,IDC_MAIN_EDIT);
    SetWindowPos(hEdit, 0,0,0,RectSize.right,RectSize.bottom,SWP_NOZORDER);
    //Process messages
    while(GetMessage(&msg,0,0,0) ){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}
雷米·勒博(Remy Lebeau)

ESC编辑处于焦点状态时不会WM_COMMAND在编辑的父窗口中生成消息。它产生WM_KEYDOWNWM_KEYUPWM_CHARWM_UNICHAR邮件编辑窗口本身。

更新:您只在处理发往父窗口的消息。您需要将消息过程分配给编辑窗口,例如:

WNDPROC lpEditWndProc;

LRESULT CALLBACK MyEditCallBckProcedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if( (uMsg == WM_CHAR) && (wParam == VK_ESCAPE) )
    {
        PostQuitMessage(0);
        return 0;
    }
    return CallWindowProc(lpEditWndProc, hWnd, uMsg, wParam, lParam);
}

...

HWND hEdit = CreateWindowEx(...);
lpEditWndProc := (WNDPROC) SetWindowLongPtr(hEdit, GWL_WNDPROC, (LONG_PTR)&MyEditCallBckProcedure);

或者:

LRESULT CALLBACK MyEditCallBckProcedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
    if( (uMsg == WM_CHAR) && (wParam == VK_ESCAPE) )
    {
        PostQuitMessage(0);
        return 0;
    }
    return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}

...

HWND hEdit = CreateWindowEx(...);
SetWindowSubclass(hEdit, &MyEditCallBckProcedure, 0, 0);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Win32 API:如何在Edit控件中捕获转义键?

来自分类Dev

如何禁用按钮-Win32 API

来自分类Dev

GetGuiResources WIn32 API使用

来自分类Dev

Win32 API SearchPath失败

来自分类Dev

GetGuiResources WIn32 API使用

来自分类Dev

Java到Win32加密API

来自分类Dev

Win32 API 无法 CreateWindowW()

来自分类Dev

如何使在Win32复选框?

来自分类Dev

Win32 Edit控件混合大小写

来自分类Dev

Win32 Edit控件混合大小写

来自分类Dev

Win32 API:如何在编辑控件中更改部分文本的颜色

来自分类Dev

Win32 API:如何在编辑控件中更改部分文本的颜色

来自分类Dev

如何停止以Win32 :: Daemon启动的Win32服务?

来自分类Dev

如何在不显示文本的情况下分配Win32 EDIT控件的窗口名称?

来自分类Dev

如何在Win32程序中设置以记住大小

来自分类Dev

如何清除Win32 API中的屏幕

来自分类Dev

捕获Win32 / Opengl中的鼠标移动

来自分类Dev

如何在Ubuntu for Win32上交叉编译Clang?

来自分类Dev

Windows:如何拦截Win32磁盘I / O API

来自分类Dev

如何为Win32 API声明变量?

来自分类Dev

无法在Win32 API中读取HWND的内存

来自分类Dev

Win32自定义绘制树视图控件

来自分类Dev

使编辑控件透明化WinAPI(win32)

来自分类Dev

C ++ Win32静态控件透明背景

来自分类Dev

在C ++ Win32程序中,如何修改菜单标题?

来自分类Dev

调用win32 API并回调类函数

来自分类Dev

在Python中使用WIN32 API CreateProcessAsUser

来自分类Dev

Win32 API独有的功能?

来自分类Dev

Win32 API C ++菜单栏