Как сделать, чтобы при вводе пароля, если человек нажимал Esc, программа бы закрывалась

Подскажите, можно ли сделать, чтобы, например, при вводе пароля, если человек нажимал Esc, программа закрывалась бы.

Именно не до начала ввода, и не после, а в любой момент. К примеру, я ввел 1223 и потом нажал Esc.


Ответы (1 шт):

Автор решения: LShadow77

Если речь идёт об использовании WinAPI, то для подобных целей в Windows существует так называемый субклассинг окон. Это когда заменяется оконная процедура (в нашем случае эдитконтрола), которая перехватывает и по-своему обрабатывает сообщения (в нашем случае - WM_KEYDOWN). Для иллюстрации я тут "на коленке" набросал пример, который работает под Win64 (под Win32 принцип тот же, хоть код будет немного другой).

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


WNDPROC g_editWndProc;


LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hWnd;
    MSG msg;

    hWnd = CreateWindowEx(0, "EDIT", NULL, WS_BORDER | WS_VISIBLE | WS_VSCROLL | ES_LEFT | 
                           ES_PASSWORD | ES_AUTOVSCROLL,
                            CW_USEDEFAULT, CW_USEDEFAULT, 100, 10,
                            NULL, NULL, hInstance, 0);
    if(!hWnd)
    {
        MessageBox(NULL,"Can't create the main window!","Fatal error",MB_OK | MB_ICONERROR);
        return 1;
    }


    g_editWndProc = (WNDPROC)SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)WndProc);

    ShowWindow(hWnd,SW_SHOWNORMAL);
    UpdateWindow(hWnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_KEYDOWN:
        if (wParam==VK_ESCAPE) DestroyWindow(hWnd);
        return CallWindowProc(g_editWndProc, hWnd,uMsg,wParam,lParam);


    case WM_DESTROY:
        {
            char szBuf[100];
            char szBuf2[1000];
            GetWindowText(hWnd, szBuf, 99);
            snprintf(szBuf2, 1000, "You enterd password: %s", szBuf);
            MessageBox(hWnd, szBuf2, "Password", MB_OK);
        }
        SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)g_editWndProc);
        PostQuitMessage(0);
    }

    return CallWindowProc(g_editWndProc, hWnd,uMsg,wParam,lParam);
}
→ Ссылка