IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Probleme de Handles


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 98
    Points : 74
    Points
    74
    Par défaut Probleme de Handles
    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 :
    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.
    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 .

  2. #2
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    Bonjour,

    le test est fait sur i et non sur Tableau [i]

    de plus quelque soit le résultat on ajoute un item à tableau



    peut être comme çà ?

    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 tableau[i]=integer(wnd) then
    break // on arrette la boucle
    else //sinon
    begin
    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;
    end;

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 98
    Points : 74
    Points
    74
    Par défaut
    yop
    merci pour ta reponse mais enfaite c'etait ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme ReadConsole (handle)
    Par chuko dans le forum C
    Réponses: 3
    Dernier message: 19/02/2009, 13h47
  2. Probleme de HANDLE sur OpenProcess
    Par chuko dans le forum C
    Réponses: 2
    Dernier message: 14/10/2008, 12h50
  3. Probleme de handle pour le postmessage
    Par fefay dans le forum Langage
    Réponses: 3
    Dernier message: 04/05/2006, 15h26
  4. Réponses: 19
    Dernier message: 28/06/2005, 14h16
  5. TThread: probleme de recuperation du Handle
    Par code34 dans le forum Langage
    Réponses: 8
    Dernier message: 07/09/2003, 03h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo