Как корректно скопировать текст из поля ввода (edit) в файл, используя winapi? (язык Си)

Рейтинг: 0Ответов: 0Опубликовано: 14.05.2023

winapi никогда до данного задания не использовал, всему учился по роликам на ютубе, проблема следующая.

Требуется создать поле ввода, куда пользователь вводит свой логин. После этот логин нужно скопировать в файл. В файле я ожидаю после получить следующее содержимое: "{логин} : {пароль}", поэтому strcat оформлена соответствующе. Но возникли проблемы со считываем из поля ввода, т.к из-за считывания в цикле считывается каждая новая запись пароля (показал в скриншоте)

Процесс ввода:

процесс ввода

И вот что получаю в текстовом файле:

введите сюда описание изображения

Вопрос, как скопировать эту конечную надпись, когда уже написано целое слово?

Вот мой код:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <locale.h>
#include <string.h>


#define edt1_id 2
HWND edt;
FILE* output;
LRESULT WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
    
    char login[64];
    if (message == WM_DESTROY)
        PostQuitMessage(0);

    else if (message == WM_COMMAND)
    {
        if (LOWORD(wparam) == edt1_id)
        {

            int nc = HIWORD(wparam);
            if (nc == EN_CHANGE)
            {
                GetWindowTextA(lparam, login, 64);
                printf("%s\n", login);
                strcat(login, " : ");
                if ((output = fopen("C:\\data\\result.txt", "a")) == NULL)
                    exit(1);
                fwrite(login, sizeof(char), strlen(login), output);
                fclose(output);
            }
        }
        
    }
    else return DefWindowProcA(hwnd, message, wparam, lparam);
}

int main()
{
    setlocale(LC_ALL, "rus");

    LPRECT rctScr;
    rctScr = malloc(sizeof(*rctScr));
    GetClientRect(GetDesktopWindow(), rctScr);


    WNDCLASSA wcl;
    memset(&wcl, 0, sizeof(WNDCLASSA));
    wcl.lpszClassName = "my Window";
    wcl.lpfnWndProc = WndProc;
    RegisterClassA(&wcl); 
    HWND hwnd;
    hwnd = CreateWindowA("my Window", "Window Name", WS_OVERLAPPEDWINDOW, 0, 0, rctScr[0].right, rctScr[0].bottom, NULL, NULL, NULL, NULL); 
    //создали окно
    ShowWindow(hwnd, SW_SHOWNORMAL);
    //показали окно

    edt = CreateWindow(L"Edit", "", WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT, 50, 80, 120, 20, hwnd, edt1_id, NULL, NULL, NULL);
    //создали поле ввода

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

Или может быть как-то можно завершить ввод нажатием enter, например? Или как-то дать программе понять, что ввод окончен, чтобы скопировать уже не из цикла.


UPD: я придумал, как сделать копирование при нажатии клавиши enter.

LRESULT WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
    
    char login[64];
    if (message == WM_DESTROY)
        PostQuitMessage(0);

    else if (message == VK_RETURN)
    {
        if (wparam == 13)
        {
            printf("Enter");
            GetWindowTextA(edt, login, 64);
            printf("\n%s\n", login);
            strcat(login, " : ");
            if ((output = fopen("C:\\data\\result.txt", "a")) == NULL)
                exit(1);
            fwrite(login, sizeof(char), strlen(login), output);
            fclose(output);
        }

    }
    else return DefWindowProcA(hwnd, message, wparam, lparam);
}

Теперь возникла следующая проблема, как обработать нажатие enter? Посмотрел большое количество информации по данному вопросу, но ничего дельного не выяснил. Прошу, помогите

Ответы

Ответов пока нет.