1

Konu: Klavyeden basilan tuslari okumak ?

Merhaba,

Windows ortaminda herhangi bir programda iken basilan tuslari, yazilanlari kaydeden bir program yapmak istiyorum.

Visual Fox Pro
x=0

DO WHILE x<>27
   x=INKEY()
   IF x<>0
      ?? chr(x)
   endif
ENDDO

]

basit sekli ile yukaridaki kod bana klavyeden bastigim tusu veriyor. ama program aktif iken calisiyor. yani programi minimize edip gidip bir baska program acip orada tuslara basarsam onlari gormuyor.

bunu yapmanin bir yolu varmidir?

Klasik ama cok dogru - Bilgi Paylastikca Cogalir ve Degerlenir !

2

Re: Klavyeden basilan tuslari okumak ?

Bu konuyu bu forum a ikinci yazisim ama nedense kimsecikler ilgilenmek istemiyor. Amacim virus yazmak falan degil yada bir baskasinin bilgisayari ile ugrasmak falan degil. Hem zaten virus yazacak kadar bilgim olsaydi sanirim simdi boyle surunmezdim smile

Benim amacim bilgisayarimda olan bitenleri ogrenmek. Bunun icin etrafta bir suru hazirda yazilmis programlar var biliyorum ama bana ait sifreleri almadiklarini kim garanti edebilir. azicik programcilik bilgime buradan da destek alarak kendi capimda birseycikler yaparim diye dusunmustum ama sanirim birileri beni kotu adam ilan etti.

saglik olsun

Klasik ama cok dogru - Bilgi Paylastikca Cogalir ve Degerlenir !

3

Re: Klavyeden basilan tuslari okumak ?

Bence öyle düşünme,
ilk bakışta söylediğini VFP ile yapmak zor gibi gözüktüğü içindir.
VFP dışında PC deki gelişen olaylari takip etmek farkli yazilim teknolojisi gerektiriyor olabilir.
ilk bakışta bende lazim olsa nasil yaparim diye düşündüm ama bu emin olmamakla birlikte
MultiThreaded gerektiren bir durum gibi geliyor bana ama doğrusu emin değilim.

4

Re: Klavyeden basilan tuslari okumak ?

Bunu yapabilmen için windows api kullanmalısın. Aksi takdirde sadece VFP içerisindekileri yakalarsın. Key logger yada keys api şeklinde aratırsan bulabilirsin. Bunun bende VFP kodu vardı ama kayıp şu anda. Baktım bulamadım. Thread gerek yok. Birkaç api sadece.

5

Re: Klavyeden basilan tuslari okumak ?

AdamOlmaz yazdı:

Bunu yapabilmen için windows api kullanmalısın. Aksi takdirde sadece VFP içerisindekileri yakalarsın. Key logger yada keys api şeklinde aratırsan bulabilirsin. Bunun bende VFP kodu vardı ama kayıp şu anda. Baktım bulamadım. Thread gerek yok. Birkaç api sadece.


google da keylogger diye aratma yaparsan sanırım karsına bu amac icin yapılmıs bir suru program cikacaktir. ayrica keylogger api de ise yarayacaktır.

6 Son düzenleyen, ozgurtetik (29.11.2006 11:08:34)

Re: Klavyeden basilan tuslari okumak ?

Attribute VB_Name = "Module1"
Option Explicit
Public Declare Function SetHook Lib "kbhookdll.dll" (ByVal hWnd As Long) As Long
Public Declare Function RemoveHook Lib "kbhookdll.dll" () As Long

Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
Public Declare Function ToAscii Lib "user32" (ByVal uVirtKey As Long, ByVal uScanCode As Long, lpbKeyState As Byte, lpwTransKey As Long, ByVal fuState As Long) As Long
Public Declare Function GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As Long

Public Const WM_USER = &H400
Public Const WM_COPYDATA = &H4A

Public Const GWL_WNDPROC = (-4)
Public KeyboardState(0 To 255) As Byte
Public PrevFuncPointer As Long
Public Function WindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    'Here wParam - Virtual KeyCode, lParam - Keyboard ScanCode
    Dim RetVal As Long
    Dim KeyAscii As Long
    Dim KeyName As String
    'On Error GoTo ErrHandler
    
    'Is this the message from the dll
    If Msg = WM_USER Then
    'Now read we the keys
        If (lParam And &H80000000) = 0 Then 'KeyDown Event
            If GetKeyboardState(KeyboardState(0)) <> 0 Then
              RetVal = ToAscii(wParam, lParam, KeyboardState(0), KeyAscii, 0)
              If (RetVal = 1) And ((KeyAscii > 31) Or (KeyAscii = 13)) Then
              'Key my be just added to the log
                If KeyAscii = 13 Then 'Return key Pressed
                    Form1.Text1.Text = Form1.Text1.Text & "{ENTER}"
                Else 'Character Keys pressed
                    Form1.Text1.Text = Form1.Text1.Text & Chr(KeyAscii)
                End If
              Else 'other keys
                KeyName = String(20, " ")
                RetVal = GetKeyNameText(lParam, KeyName, 20)
                If RetVal <> 0 Then
                    KeyName = Left(KeyName, RetVal)
                    Form1.Text1.Text = Form1.Text1.Text & "{" & KeyName & "}"
                End If
              End If
            End If
        Else 'KeyUp Event
          'Nothing here now
        End If
    End If
    
    'Pass the procedure to the default handler
    WindowProc = CallWindowProc(PrevFuncPointer, hWnd, Msg, wParam, lParam)
    Exit Function
ErrHandler:
  MsgBox Err.Description
  RemoveHook
  Err.Clear
End Function


boyle bir kod buldum ama VFP ya ceviremedim. yardimci olabilir misiniz?

Klasik ama cok dogru - Bilgi Paylastikca Cogalir ve Degerlenir !

7

Re: Klavyeden basilan tuslari okumak ?

cevirdim smile

hata vermiyor. ama birseyde yapmiyor. ne eksik acaba. yada cevirdim derken kendimi mi kandiriyorum ? roll


Visual Fox Pro
Declare SetHook in "kbhookdll.dll" As Long (ByVal hWnd)

Declare RemoveHook in "kbhookdll.dll" As Long
 
Declare CallWindowProc in "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare SetWindowLong in "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare GetKeyboardState in "user32" (pbKeyState As Byte) As Long
Declare ToAscii in "user32" (ByVal uVirtKey As Long, ByVal uScanCode As Long, lpbKeyState As Byte, lpwTransKey As Long, ByVal fuState As Long) As Long
Declare GetKeyNameText in "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As Long
 
 
WM_USER = "&H400"
WM_COPYDATA = "&H4A"
 
GWL_WNDPROC = -4
 
Function WindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    *Here wParam - Virtual KeyCode, lParam - Keyboard ScanCode
    *On Error GoTo ErrHandler
 
    *Is this the message from the dll
    If Msg = WM_USER
        *Now read we the keys
        If (lParam And &H80000000) = 0 Then &&KeyDown Event
            If GetKeyboardState(KeyboardState(0)) <> 0
              RetVal = ToAscii(wParam, lParam, KeyboardState(0), KeyAscii, 0)
              If (RetVal = 1) And ((KeyAscii > 31) Or (KeyAscii = 13))
                 *Key my be just added to the log
                 If KeyAscii = 13 && 'Return key Pressed
                    Form1.Text1.Text = Form1.Text1.Text + "{ENTER}"
                Else &&Character Keys pressed
                    Form1.Text1.Text = Form1.Text1.Text + Chr(KeyAscii)
                EndIf
              Else &&'other keys
                KeyName = REPLICATE(" ",20)
                RetVal = GetKeyNameText(lParam, KeyName, 20)
                If RetVal <> 0
                    KeyName = Left(KeyName, RetVal)
                    Form1.Text1.Text = Form1.Text1.Text + "{" + KeyName + "}"
                EndIf
              EndIf
            EndIf
        Else &&'KeyUp Event
          &&'Nothing here now
        EndIf
    EndIf
 
    *'Pass the procedure to the default handler
    WindowProc = CallWindowProc(PrevFuncPointer, hWnd, Msg, wParam, lParam)
    return
Klasik ama cok dogru - Bilgi Paylastikca Cogalir ve Degerlenir !