cricri_b34
Messages postés223Date d'inscriptionmercredi 21 juillet 2004StatutMembreDernière intervention15 février 2006
-
10 janv. 2006 à 03:30
cricri_b34
Messages postés223Date d'inscriptionmercredi 21 juillet 2004StatutMembreDernière intervention15 février 2006
-
16 janv. 2006 à 19:11
salut , J'ai un code en delphi que j'aimerais traduire en assembleur (masm32) :
var
KeyTable: array [0..255] of boolean
[....]
procedure CheckState;
var
I: integer;
begin
for I := 0 to 255 do
begin
if KeyTable[I]<>(GetAsyncKeyState(I)<>0) then
begin
if (I=1) then
begin
// souris gauche
if not KeyTable[1] then
begin
OnMouseDown()
end;
end
else
begin
// clavier
if not KeyTable[I] then
begin
OnKeyDown(I);
end;
end;
KeyTable[I] := GetAsyncKeyState(I)<>0;
end;
end;
end;
Cette procedure est executé a chaque millièmes de secondes et permet d'intercepter l'appui des touches du clavier et des boutons de la souris.
Donc j'aimerais m'en servir pour un programme en masm32. J'ai commecé a le traduire... voici le résultat :
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 10 janv. 2006 à 14:07
salut,
un truc dans le genre:
TableState db 256 dup(0) ; 0 a 255 = 256 valeures byte
CheckState PROC USES ESI
mov esi,256
@1:
dec esi ; for esi = 255 to 0
jb @3
invoke GetAsynKeyState,esi ; ecx certainement detruit lors de cet appel.
test ax,ax
setne cl ; GetAsynKeyState <> 0
cmp TableState[esi],cl ; <> TableState[I]
je @1
not TableState[esi] ; juste inversé la comparaison de I=0 et not TableState[I]
je @1
cmp esi,1
jne @2
invoke OnMouseDown
jmp @1
@2:
invoke OnKeyDown
jmp @1
@3:
ret
CheckState ENDP
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 11 janv. 2006 à 23:59
CheckState PROC USES ESI
mov esi,256
@1:
dec esi ; for esi = 255 to 0
jb @3
invoke GetAsynKeyState,esi ; ecx certainement detruit lors de cet appel.
test ax,ax
setne cl ; GetAsynKeyState <> 0
cmp TableState[esi],cl ; <> TableState[I]
je @1
not TableState[esi] ; juste inversé la comparaison de I=0 et not TableState[I]
je @1
mov TableState[esi],cl ; voila le KeyTable[I] := GetAsyncKeyState(I)<>0 manquant
cmp esi,1
je @2 ; on inverse le test: sautera 1 fois au lieu de 255 ;-)
invoke OnKeyDown
jmp @1
@2:
invoke OnMouseDown
jmp @1
@3:
ret
CheckState ENDP
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 12 janv. 2006 à 00:31
je l'ai mal placé dans la boucle:
TableState db 257 dup(0) ; 0 a 255 = 256 valeures byte
CheckState PROC USES ESI
mov esi,256
@0:
mov TableState[esi],cl ; la premiere entrée ne compte pas d'ou TableState db 257
c'est juste pour eviter un "jmp @1" avant @0
@1:
dec esi ; for esi = 255 to 0
jb @3
invoke GetAsynKeyState,esi ; ecx certainement detruit lors de cet appel.
test ax,ax
setne cl ; GetAsynKeyState <> 0
cmp TableState[esi],cl ; <> TableState[I]
je @1
not TableState[esi] ; juste inversé la comparaison de I=0 et not TableState[I]
je @0
cmp esi,1
je @2 ; on inverse le test: sautera 1 fois au lieu de 255 ;-)
invoke OnKeyDown
jmp @0
@2:
invoke OnMouseDown
jmp @0
@3:
ret
CheckState ENDP
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 12 janv. 2006 à 00:36
faudrait reflechir avant de poster mais bon ...
TableState db 256 dup(0) ; 0 a 255 = 256 valeures byte
CheckState PROC USES ESI
mov esi,256
@1:
dec esi ; for esi = 255 to 0
jb @3
invoke GetAsynKeyState,esi ; ecx certainement detruit lors de cet appel.
test ax,ax
setne cl ; GetAsynKeyState <> 0
cmp TableState[esi],cl ; <> TableState[I]
je @1
not TableState[esi] ; juste inversé la comparaison de I=1 et not TableState[I]
mov TableState[esi],cl ; il a mieux sa place là tout simplement
je @1
cmp esi,1
je @2 ; on inverse le test: sautera 1 fois au lieu de 255 ;-)
invoke OnKeyDown
jmp @1
@2:
invoke OnMouseDown
jmp @1
@3:
ret
CheckState ENDP
il me semble que c'est ça mais je peux me gourrer avec tout ces begin / end.
cricri_b34
Messages postés223Date d'inscriptionmercredi 21 juillet 2004StatutMembreDernière intervention15 février 2006 13 janv. 2006 à 19:16
non... ca marche toujours pas :
CheckState PROC USES ESI
mov esi,256
@1:
dec esi ; for esi = 255 to 0
jb @3
invoke GetAsyncKeyState,esi ; ecx certainement detruit lors de cet appel.
test ax,ax
setne cl ; GetAsynKeyState <> 0
cmp TableState[esi],cl ; <> TableState[I]
je @1
not TableState[esi] ; juste inversé la comparaison de I=1 et not TableState[I]
mov TableState[esi],cl ; il a mieux sa place là tout simplement
je @1
cmp esi,1
je @2 ; on inverse le test: sautera 1 fois au lieu de 255 ;-)
;invoke OnKeyDown
invoke MessageBox, 0, 0, 0, 0
jmp @1
@2:
;invoke OnMouseDown
jmp @1
@3:
ret
CheckState ENDP
cricri_b34
Messages postés223Date d'inscriptionmercredi 21 juillet 2004StatutMembreDernière intervention15 février 2006 13 janv. 2006 à 19:34
bon le voici :
Dim TableState(255) As Boolean
[...]
Private Sub Timer1_Timer()
Dim I As Integer
For I = 0 To 255
If (TableState(I) <> (GetAsyncKeyState(I) <> 0)) Then
If (GetAsyncKeyState(I) <> 0) Then
If (I <> 1) Then
MsgBox ("Une touche vient d'être appuyé!")
End If
TableState(I) = True
Else
TableState(I) = False
End If
End If
Next I
End Sub
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 14 janv. 2006 à 01:54
salut,
commme dit BruNews, le clavier est a la base géré par interruption, faire une lecture tout les x ms revient a supprimer cette interruption et donc a perdre un temps precieux.
par contre, les touches voulues sont celles de l'application ou celles du system ?
y'a pas de message WM_KEYDOWN / WM_KEYUP en VB ? Ca m'etonnerai vu que tout depends de l'api win32. Un hook WH_KEYBOARD ne gere que ces messages de toute façon.
un hook system requiert forcement une dll par contre, le clavier peut etre hooker uniquement pour l'application et le code peut etre dans l'exe.
cricri_b34
Messages postés223Date d'inscriptionmercredi 21 juillet 2004StatutMembreDernière intervention15 février 2006 14 janv. 2006 à 04:08
ouais je c c quoi un hook, mais a ce que je sache, on est oubligé de le mettre dans une library (dll). c'est donc beaucoup plus simple d'utiliser un timer....
maitenant j'aimerais tout simplement qu'on réponde a ma question
cricri_b34
Messages postés223Date d'inscriptionmercredi 21 juillet 2004StatutMembreDernière intervention15 février 2006 16 janv. 2006 à 19:11
... marche pas :
CheckState PROC USES ESI
mov esi,256
@1:
dec esi ; for esi = 255 to 0
js @3
invoke GetAsyncKeyState,esi ; ecx certainement detruit lors de cet appel.
test ax,ax
setne cl ; GetAsynKeyState <> 0
cmp TableState[esi],cl ; <> TableState[I]
je @1
not TableState[esi] ; juste inversé la comparaison de I=1 et not TableState[I]
mov TableState[esi],cl ; il a mieux sa place là tout simplement
je @1
cmp esi,1
je @2 ; on inverse le test: sautera 1 fois au lieu de 255 ;-)
;invoke OnKeyDown
invoke MessageBox, 0, 0, 0, 0
jmp @1
@2:
;invoke OnMouseDown
jmp @1
@3:
ret
CheckState ENDP