begin process at 2008 08 29 21:46:24
1 233 909 membres
430 nouveaux aujourd'hui
14 294 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Probleme de Handles [ Archives / J'AI BESOIN D'AIDE !!!! :O ] (Mxbug)

Probleme de Handles le 27/11/2005 01:06:36

Mxbug
Yop voila j'essaye de faire une ptite application d'auto message sur msn ( msn plus avec tout ses sons fait *** ) . le code est le suivant avec quelques commentaires vite fait : [quote]unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, MessengerAPIEvents, StdCtrls, WinSkinData; type TForm1 = class(TForm) MessengerAPIDMessengerEvents1: TMessengerAPIDMessengerEvents; Button1: TButton; Edit1: TEdit; Memo1: TMemo; SkinData1: TSkinData; procedure Button1Click(Sender: TObject); procedure MessengerAPIDMessengerEvents1IMWindowCreated(Sender: TObject; const pIMWindow: IDispatch); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; // la form Window: String; // Handle: THandle; // le handle Msg: Tmsg; IMessage: String = ('je teste fais pas attention , merci '); hwin:Hwnd ; Wnd:Hwnd; //le handle de la fenetre msn Tableau: array of Integer; i : integer ; implementation {$R *.dfm} Function TrimRight(Const S: String): String; // fonction pour avoir le titre Var I: Integer; Begin I := Length(S); While (I > 0) And (S[I] <= ' ') Do Dec(I); Result := Copy(S, 1, I); end; Function ActiveHandle: THandle; // fonction pour avoir le handle active Begin Result := GetForeGroundWindow; End; Function ActiveCaption: String; // fonction pour avoir le titre active Var Handle: THandle; // handle qu'on donnera a la conversation ouverte Len: LongInt; Title: String; // titre Begin hWin := FindWindowA(PChar('IMWindowClass'), Nil); // on trouve la conversation Handle := hwin; // c ici qu'on donne le handle a la conversation Len := GetWindowTextLength(Handle) + 1; SetLength(Title, Len); GetWindowText(Handle, pChar(Title), Len); ActiveCaption := TrimRight(Title); End; Procedure SendKeys(Const text: String); // pour envoyer le message Var i: Integer; shift: Boolean; vk, scancode: Word; ch: Char; c, s: Byte; Const vk_keys: Array[0..9] Of Byte = (VK_HOME, VK_END, VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_PRIOR, VK_NEXT, VK_INSERT, VK_DELETE); vk_shft: Array[0..2] Of Byte = (VK_SHIFT, VK_CONTROL, VK_MENU); flags: Array[false..true] Of Integer = (KEYEVENTF_KEYUP, 0); Begin shift := false; For i := 1 To Length(text) Do Begin ch := text[i]; If ch >= #250 Then Begin s := Ord(ch) - 250; shift := Not Odd(s); c := vk_shft[s Shr 1]; scancode := MapVirtualKey(c, 0); Keybd_Event(c, scancode, flags[shift], 0); End Else Begin vk := 0; If ch >= #240 Then c := vk_keys[Ord(ch) - 240] Else If ch >= #228 Then c := Ord(ch) - 116 Else If ch < #32 Then c := Ord(ch) Else Begin vk := VkKeyScan(ch); c := LoByte(vk); End; scancode := MapVirtualKey(c, 0); If Not shift And (Hi(vk) > 0) Then Keybd_Event(VK_SHIFT, $2A, 0, 0); Keybd_Event(c, scancode, 0, 0); Keybd_Event(c, scancode, KEYEVENTF_KEYUP, 0); If Not shift And (Hi(vk) > 0) Then Keybd_Event(VK_SHIFT, $2A, KEYEVENTF_KEYUP, 0); End; End; End; function TimerFunc (H: hwnd;uMsg : UINT;idEvent : UINT;dwTime : DWORD ): BOOL; stdcall; // pouyr finir l'envoi de message begin If (Handle <> ActiveHandle) Then If (Window <> ActiveCaption) Then Begin Window := ActiveCaption; If Window = ActiveCaption then Begin SendKeys(Pchar('Automessage : ' + IMessage + #13)); End; End; end; procedure SwitchToThisWindow(h1: hWnd; x: bool); stdcall; // fonction pour mettre la fenetre en premier plan external user32 Name 'SwitchToThisWindow'; procedure TForm1.FormCreate(Sender: TObject); begin setlength(tableau,10000000); SetTimer(wnd,0,1000,@TimerFunc); // chaque 1 seconde on revient a la fonction qui envoi le message c a dire timerfunc SetTimer(form1.handle,0,1000,@TForm1.MessengerAPIDMessengerEvents1IMWindowCreated); // chaque 1 seconde on revient a la fonction qui regarde si quelqun nous a parlé end; [color=red]procedure TForm1.MessengerAPIDMessengerEvents1IMWindowCreated(Sender: TObject; const pIMWindow: IDispatch); //la fonction qui regarde si quelqun nous a parlé begin wnd:=FindWindowA(PChar('IMWindowClass'), Nil); // on recherche encore la fenetre et on la donne a wnd for i:=0 to tableau[10000000] do //on parcour le tableau if i=integer(wnd) then break // on arrette la boucle else //sinon SwitchToThisWindow(wnd, True); // on met la fenetre au premier plan ( a ce moment timerfunc va envoyer le message ) tableau[i+1]:=integer(wnd) // on stocke dans une cellule du tableau le handle end;[/color] procedure TForm1.Button1Click(Sender: TObject); begin imessage:=edit1.text; end; end. [/quote] le probleme vient du code en rouge , avec mon code le programme est supposé a chaque ouverture de fenetre voir si c une fenetre msn , puis envoyer le message si s'en est une , puis stocker la valeur de son handle dans un tableau et puis reparcourir el tableau si il trouve le handle de la fenetre il la laisse tranquille et ne la met pas au premier plan , sinon il la met au premier plan et envoi le message et puis stock encore son handle dans le tableau . le probleme ici c'est qu'elle devient toujours au premier plan meme si le handle a été inscrit sur le tableau :?. voila merci esperant avoir été clair .

Re : Probleme de Handles le 27/11/2005 01:11:28

Mxbug
desolé , je reecris le code ici : unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, MessengerAPIEvents, StdCtrls, WinSkinData; type TForm1 = class(TForm) MessengerAPIDMessengerEvents1: TMessengerAPIDMessengerEvents; Button1: TButton; Edit1: TEdit; Memo1: TMemo; SkinData1: TSkinData; procedure Button1Click(Sender: TObject); procedure MessengerAPIDMessengerEvents1IMWindowCreated(Sender: TObject; const pIMWindow: IDispatch); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; // la form Window: String; // Handle: THandle; // le handle Msg: Tmsg; IMessage: String = ('je teste fais pas attention , merci '); hwin:Hwnd ; Wnd:Hwnd; //le handle de la fenetre msn Tableau: array of Integer; i : integer ; implementation {$R *.dfm} Function TrimRight(Const S: String): String; // fonction pour avoir le titre Var I: Integer; Begin I := Length(S); While (I > 0) And (S[I] <= ' ') Do Dec(I); Result := Copy(S, 1, I); end; Function ActiveHandle: THandle; // fonction pour avoir le handle active Begin Result := GetForeGroundWindow; End; Function ActiveCaption: String; // fonction pour avoir le titre active Var Handle: THandle; // handle qu'on donnera a la conversation ouverte Len: LongInt; Title: String; // titre Begin hWin := FindWindowA(PChar('IMWindowClass'), Nil); // on trouve la conversation Handle := hwin; // c ici qu'on donne le handle a la conversation Len := GetWindowTextLength(Handle) + 1; SetLength(Title, Len); GetWindowText(Handle, pChar(Title), Len); ActiveCaption := TrimRight(Title); End; Procedure SendKeys(Const text: String); // pour envoyer le message Var i: Integer; shift: Boolean; vk, scancode: Word; ch: Char; c, s: Byte; Const vk_keys: Array[0..9] Of Byte = (VK_HOME, VK_END, VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_PRIOR, VK_NEXT, VK_INSERT, VK_DELETE); vk_shft: Array[0..2] Of Byte = (VK_SHIFT, VK_CONTROL, VK_MENU); flags: Array[false..true] Of Integer = (KEYEVENTF_KEYUP, 0); Begin shift := false; For i := 1 To Length(text) Do Begin ch := text[i]; If ch >= #250 Then Begin s := Ord(ch) - 250; shift := Not Odd(s); c := vk_shft[s Shr 1]; scancode := MapVirtualKey(c, 0); Keybd_Event(c, scancode, flags[shift], 0); End Else Begin vk := 0; If ch >= #240 Then c := vk_keys[Ord(ch) - 240] Else If ch >= #228 Then c := Ord(ch) - 116 Else If ch < #32 Then c := Ord(ch) Else Begin vk := VkKeyScan(ch); c := LoByte(vk); End; scancode := MapVirtualKey(c, 0); If Not shift And (Hi(vk) > 0) Then Keybd_Event(VK_SHIFT, $2A, 0, 0); Keybd_Event(c, scancode, 0, 0); Keybd_Event(c, scancode, KEYEVENTF_KEYUP, 0); If Not shift And (Hi(vk) > 0) Then Keybd_Event(VK_SHIFT, $2A, KEYEVENTF_KEYUP, 0); End; End; End; function TimerFunc (H: hwnd;uMsg : UINT;idEvent : UINT;dwTime : DWORD ): BOOL; stdcall; // pouyr finir l'envoi de message begin If (Handle <> ActiveHandle) Then If (Window <> ActiveCaption) Then Begin Window := ActiveCaption; If Window = ActiveCaption then Begin SendKeys(Pchar('Automessage : ' + IMessage + #13)); End; End; end; procedure SwitchToThisWindow(h1: hWnd; x: bool); stdcall; // fonction pour mettre la fenetre en premier plan external user32 Name 'SwitchToThisWindow'; procedure TForm1.FormCreate(Sender: TObject); begin setlength(tableau,10000000); SetTimer(wnd,0,1000,@TimerFunc); // chaque 1 seconde on revient a la fonction qui envoi le message c a dire timerfunc SetTimer(form1.handle,0,1000,@TForm1.MessengerAPIDMessengerEvents1IMWindowCreated); // chaque 1 seconde on revient a la fonction qui regarde si quelqun nous a parlé end; procedure TForm1.MessengerAPIDMessengerEvents1IMWindowCreated(Sender: TObject; const pIMWindow: IDispatch); //la fonction qui regarde si quelqun nous a parlé begin wnd:=FindWindowA(PChar('IMWindowClass'), Nil); // on recherche encore la fenetre et on la donne a wnd for i:=0 to tableau[10000000] do //on parcour le tableau if i=integer(wnd) then break // on arrette la boucle else //sinon SwitchToThisWindow(wnd, True); // on met la fenetre au premier plan ( a ce moment timerfunc va envoyer le message ) tableau[i+1]:=integer(wnd) // on stocke dans une cellule du tableau le handle end; procedure TForm1.Button1Click(Sender: TObject); begin imessage:=edit1.text; end; end.

Re : Probleme de Handles le 27/11/2005 07:48:47

Delphiprog
(Admin CS)
Tu as écrit : "le probleme vient du code en rouge".
Serions-nous tous subitement devenus daltoniens ?


Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

Re : Probleme de Handles le 27/11/2005 11:15:58

Mxbug
yop desolé c'est un copier coller d'un autre forum oui je n'ai pas eu de reponse voila le code en rouge : procedure TForm1.MessengerAPIDMessengerEvents1IMWindowCreated(Sender: TObject; const pIMWindow: IDispatch); //la fonction qui regarde si quelqun nous a parlé begin wnd:=FindWindowA(PChar('IMWindowClass'), Nil); // on recherche encore la fenetre et on la donne a wnd for i:=0 to tableau[10000000] do //on parcour le tableau if i=integer(wnd) then break // on arrette la boucle else //sinon SwitchToThisWindow(wnd, True); // on met la fenetre au premier plan ( a ce moment timerfunc va envoyer le message ) tableau[i+1]:=integer(wnd) // on stocke dans une cellule du tableau le handle end;

Re : Probleme de Handles le 27/11/2005 11:36:19

cirec
Membre Club
(Admin CS)

Bonjour MxBug,
je suppose que c'est "MessengerAPIDMessengerEvents1IMWindowCreated" qui pose problème, donc ce qui est en Rouge   à été modifier ou ajouté


Au passage tu déclares un tableau dinamique et tu lui fixes sa longueur à "10000000"
l'intérêt du tableau dinamique c'est justement de pouvoir adapter sa taille au besoin.
et " hwnd et THandle " sont de type Integer donc pas besoin de transtyper.

Et pour finir évite de déclarer une variable nomé handle qui pourrait être confondue par le compilateur avec le handle de la form où d'un composent renome le en aHandle par Ex.
procedure TForm1.FormCreate(Sender: TObject);
begin
setlength(tableau,0);
SetTimer(wnd,0,1000,@TimerFunc); // chaque 1 seconde on revient a la fonction qui envoi le message c a dire timerfunc
SetTimer(form1.handle,0,1000,@TForm1.MessengerAPIDMessengerEvents1IMWindowCreated); // chaque 1 seconde on revient a la fonction qui regarde si quelqun nous a parlé
end;


procedure TForm1.MessengerAPIDMessengerEvents1IMWindowCreated(Sender: TObject;
const pIMWindow: IDispatch); //la fonction qui regarde si quelqun nous a parlé
Var 
 Found : Boolean;
begin
Found := False;
wnd:=FindWindowA(PChar('IMWindowClass'), Nil); // on recherche encore la fenetre et on la donne a wnd
If wnd <> 0 Then
for i:=0 to High(tableau) do //on parcour le tableau   (Tableau[1000000] = 38)
if Tableau[i] = wnd then
Begin
Found := True;
break;// on arrette la boucle
End;
If not Found Then //sinon
Begin
SetLength(Tableau, Length(Tableau)+1); //on ajoute une entrée au Tableau
SwitchToThisWindow(wnd, True); // on met la fenetre au premier plan ( a ce moment timerfunc va envoyer le message )
tableau[High(Tableau)] := wnd // on stocke dans une cellule du tableau le handle
End;
end;



Re : Probleme de Handles le 27/11/2005 12:12:13

Mxbug
yop merci a toi cirec ca marche ;) .

Re : Probleme de Handles le 27/11/2005 12:20:04

cirec
Membre Club
(Admin CS)
Content que ca fonctionne
et dans l'évenement onClose de ta form tu peux mettre ceci
Finalize(Tableau); // libère le tableau dinamique
et je me demande si il ne faut pas liberé ton timer, d'ailleur pourquoi n'utilises tu pas un TTimer

voilà c'est tout
Bon dimanche
@+
Cirec


Re : Probleme de Handles le 27/11/2005 20:08:36

Mxbug
yop j'ai un nouveau ptit probleme ici : function TimerFunc (H: hwnd;uMsg : UINT;idEvent : UINT;dwTime : DWORD ): BOOL; stdcall; // pouyr finir l'envoi de message begin If (Handle <> ActiveHandle) Then If (Window <> ActiveCaption) Then Begin Window := ActiveCaption; If Window = ActiveCaption then Begin SendKeys(Pchar('Automessage : ' + IMessage + #13)); End; End; end; apres le sendkeys j'ai essayé de reduire la fenetre car sinon le prog ne prend pas en compte les autres fenetres , mais je n'y arrive pas elle ne se reduit pas j'ai essayé : showwindow et setwindowpos ,SetForegroundWindow ,en vain :( . autre idée ??

Re : Probleme de Handles le 27/11/2005 23:06:02
Re : Probleme de Handles le 28/11/2005 10:10:34

cirec
Membre Club
(Admin CS)



Pour ton petit souci :
ShowWindow(handle de la Fenêtre , ShowCommand);

  { ShowWindow() Commands }
  SW_HIDE = 0;
  SW_SHOWNORMAL = 1
  SW_NORMAL = 1;
  SW_SHOWMINIMIZED = 2;
  SW_SHOWMAXIMIZED = 3;
  SW_MAXIMIZE = 3;
  SW_SHOWNOACTIVATE = 4;
  SW_SHOW = 5;
  SW_MINIMIZE = 6;
  SW_SHOWMINNOACTIVE = 7;
  SW_SHOWNA = 8;
  SW_RESTORE = 9;
  SW_SHOWDEFAULT = 10;
  SW_MAX = 10;

Donc pour réduire : ShowWindow(Form1.Handle, SW_MINIMIZE );

et pour la restaurer: ShowWindow(Form1.Handle, SW_RESTORE);




[Page 1 Page 2 Page 3]
Classé sous : end, tableau, handle, procedure, begin

Participer à cet échange

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS