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

 Delphi Discussion :

Apprendre à utiliser PrintWindow


Sujet :

Delphi

  1. #1
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 202
    Points : 91
    Points
    91
    Par défaut Apprendre à utiliser PrintWindow
    Bonjour,

    Une question de sous-débutant :
    voici un petit bout de code (trouvé sur le site et partiellement recopié), avec l'indication de la ligne où le problème apparaît.
    Inutile de me demander pouquoi c'est faire : C'est uniquement un exercice pour apprendre à utiliser la fonction PrintWindow.
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ShellAPI, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées}
      public
        { Déclarations publiques}
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.DFM}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
       fenetrecible,screendc,memdc:Thandle;
       rect:Trect;
       bitmap,oldbitmap:Hbitmap;
       ret:boolean;
       pixel:Tcolor;
    begin
         fenetrecible:=FindWindow(nil,'Titre de la fenetre');
         screendc:=GetDC(0);
         memdc:=CreateCompatibleDC(screendc);
         GetWindowRect(fenetrecible,rect);
         bitmap:=CreateCompatibleBitmap(screendc,rect.right-rect.left,rect.bottom-rect.top);
         ReleaseDC(0,screendc);
         oldbitmap:=SelectObject(memdc,bitmap);
         ret:=PrintWindow(fenetrecible,memdc,0);
         //c'est içi qu'apparait l'erreur Identificateur non déclaré : 'PrintWindow'
         //la suite du code est sans importance
     
         DeleteObject(bitmap);
         DeleteDC(memDC);
    end;
    end.
    il manque certainement quelque chose dans les "uses", mais quoi et où le trouver ?
    Merci par avance
    .

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 427
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @ 5x J, et ton poste avant concernant ce "Print Windows" est il marqué "Résolut" ?

    Sinon l'exemple fourni en zip à la fin de ce poste est une bonne approche pour te familiariser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function PrintWindow(HWND:HWND;hdcBlt:HDC;nFlags:DWORD):BOOL; stdcall; external 'user32.dll'
    @+,

    Cincap

  3. #3
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 202
    Points : 91
    Points
    91
    Par défaut
    @ cincap
    ton poste avant concernant ce "Print Windows" est il marqué "Résolut" ?
    Sinon l'exemple fourni en zip à la fin de ce poste est une bonne approche pour te familiariser.
    Non, il n'est pas résolu et il ne risque pas de l'être rapidement, sachant que c'est un problème sans urgence sur lequel je ne reviens que de temps en temps et peu de temps chaque fois.
    Pour les exemples fournis en zip, c'est une toute autre histoire (celui-là et d'autres essayés avant). Chaque fois, ils provoquent un plantage et je dois redémarrer pour que Delphi marche correctement à nouveau. Donc, depuis longtemps je me limite à copier uniquement des codes données en clair sur le forum et à les vérifier ligne par ligne pour que la compilation se passe bien.
    Enfin, il y a du progrès : avec la syntaxe de déclaration donnée dans ton post précédent, la fonction PrintWindow est mantenant reconnue. C'est tout ce que je souhaitais pour cette fois.
    Merci à toi.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 427
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut
    @ 5 x J,

    Chaque fois, ils provoquent un plantage et je dois redémarrer pour que Delphi marche correctement à nouveau
    Pour l'excellent zip concernant PrintWindow, il fonctionne correctement dès que tu as enlevé la ligne de trop.

    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
     
    program PrintWindowExample;
     
    uses
      Forms,
      uMain in 'uMain.pas' {Form1},
      uFunctions in 'uFunctions.pas';
     
    {$R *.res}
     
    begin
      Application.Initialize;
     // Application.MainFormOnTaskbar := True; //içi
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    Bonne route alors,

    @+,

    Cincap

  5. #5
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 202
    Points : 91
    Points
    91
    Par défaut
    @ cincap,
    Pour l'excellent zip concernant PrintWindow, il fonctionne correctement dès que tu as enlevé la ligne de trop.
    Malgré les déboires que j'ai à chaque fois que je charge un exemple, j'ai essayé. Et comme d'habitude, ca ne marche pas.
    Je ne doute pas que cet exemple soit excellent puisque tu le dis. Et il fonctionne probablement très bien pour tout le monde, mais pas pour moi.
    En effet, pour pouvoir enlever la ligne de trop, il faudrait déjà pouvoir l'ouvrir. Malheureusement, le problème arrive avant.
    Voilà exactement ce qui se passe :
    - Je récupère le fichier PrintWindow.zip
    - J'exécute "extraire tous les fichiers"
    - J'ai alors un dossier qui contient les fichiers suivants : PrintWindowExample.dpr, PrintWindowsExample.res, uFunctions.pas, uMain.pas, uMain.res, uMain.dfm
    - Je clique sur PrintWindowExample.dpr
    Delphi s'ouvre et un message apparait immédiatement : "Erreur à la création de la fiche format de flux incorrect ".
    Si je tente de continuer, d'autres messages d'erreur apparaissent successivement et on est planté
    .
    Pour pouvoir essayer cet exemple, il faudrait que j'ai le code en clair, de telle sorte que je puisse le recopier dans une unité crée par moi-même avec le logiciel Delphi dont je dispose.

  6. #6
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 202
    Points : 91
    Points
    91
    Par défaut
    Bon, ne tenez pas compte de mon post précédent.
    j'ai pu récupérer le code du fichier ufonctions.pas et c'est cela qui m'intéressait.
    En recopiant ce code dans mon propre programme et en corrigant quelques incompatibilités entre DWORD et pointer, maintenant ca se compile bien et le programme s'exécute comme je l'espérait.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 427
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @ 5x J, compilé sous D6 et Ok sous Seven 64Bits après avoir enlevé quelques résidus.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
    unit uMain;
     
    {
      Counterstrikewi
      www.delphi.co.nr
    }
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ShellAPI,
     
      uFunctions, ExtCtrls, ComCtrls, StdCtrls;
     
    type
      TForm1 = class(TForm)
        ListView1: TListView;
        Image1: TImage;
        Button1: TButton;
        Label1: TLabel;
        Label2: TLabel;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure ListView1Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Label2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
      lp : Integer;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      C : Integer;
    begin
      ListView1.Clear;
      HandleList.Clear;
      NameList.Clear;
      lp := 0;
      if EnumWindows(@zEnumProcess, lp) = false then
        MessageBox(0, 'Error','Error',0);
      for C := 0 to HandleList.Count - 1 do
      begin
        with ListView1.Items.Add do
        begin
          Caption := HandleList[C];
          SubItems.Add(NameList[C]);
        end;
      end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      C : Integer;
    begin
      HandleList := TStringList.Create;
      NameList := TStringList.Create;
      lp := 0;
      if EnumWindows(@zEnumProcess, lp) = false then
        MessageBox(0, 'Error','Error',0);
      for C := 0 to HandleList.Count - 1 do
      begin
        with ListView1.Items.Add do
        begin
          Caption := HandleList[C];
          SubItems.Add(NameList[C]);
        end;
      end;
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      HandleList.Destroy;
      NameList.Destroy;
    end;
     
    procedure TForm1.Label2Click(Sender: TObject);
    begin
      ShellExecute(Handle, 'open', 'http://www.delphi.co.nr',nil,nil, SW_SHOWNORMAL) ;
    end;
     
    procedure TForm1.ListView1Click(Sender: TObject);
    begin
      if ListView1.Items[ListView1.ItemIndex].Caption <> '' then
      begin
        zPrintWindow(StrToInt(ListView1.Items[ListView1.ItemIndex].Caption), Image1.Picture.Bitmap);
        Image1.Refresh;
      end;
    end;
     
    end.
    Dans l'unité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    program PrintWindowExample;
     
    uses
      Forms,
      uMain in 'uMain.pas' {Form1},
      uFunctions in 'uFunctions.pas';
     
     
    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    Possible aussi recréer le fichier *.res !

    Voila @+,

    Cincap

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

Discussions similaires

  1. [Bénévole] Apprendre à utiliser Git sous Windows XP.
    Par Pierre8r dans le forum Autres
    Réponses: 0
    Dernier message: 14/08/2010, 11h56
  2. Réponses: 6
    Dernier message: 03/04/2010, 20h27
  3. Apprendre à utiliser le Setfocus
    Par minsongui dans le forum Débuter
    Réponses: 2
    Dernier message: 19/03/2010, 15h13
  4. tutoriel pour apprendre à utiliser jquery, ajax. . .
    Par benja507 dans le forum jQuery
    Réponses: 1
    Dernier message: 17/10/2008, 17h22
  5. [Sérieux] Apprendre à utiliser Windows et IE
    Par margagn dans le forum La taverne du Club : Humour et divers
    Réponses: 22
    Dernier message: 19/10/2006, 20h03

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