Как корректно скопировать текст из поля ввода (edit) в файл, используя winapi? (язык Си)
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? Посмотрел большое количество информации по данному вопросу, но ничего дельного не выяснил. Прошу, помогите