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

API, COM et SDKs Delphi Discussion :

Récupérer le moniteur sur lequel se trouve une fenêtre/application


Sujet :

API, COM et SDKs Delphi

  1. #1
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut Récupérer le moniteur sur lequel se trouve une fenêtre/application
    Bonsoir ,

    Je vous expose de suite ma question
    J'ai remarqué que l'on disposait de 2 écrans et qu'on lançait une application (application tiers donc), cette dernière se lançait sur le dernier moniteur sur lequel elle s'est affiché (du moins, c'est le cas de Firefox).
    Je pense très probablement que cette information est stocké quelque part par FireFox et qu'il relit la valeur contenant le dernière moniteur sur lequel il s'est fermé pour pouvoir se relancé correctement lors de la prochaine exécution.

    Ma question est la suite :
    Est-t-il possible (je pense que oui car certains programmes le font), de tenir à jour un fichier (ou autre) indiquant que telle application doit se lancer sur tel écran. Mon but, ça serait d'en faire un service par la suite qui se chargerait de l'affectation de l'écran "principal" au démarrage de l'appli ...
    Pouvez-vous m'indiquer la direction à prendre pour trouver telle ou telle infos ? Je ne serais peut-être pas à la hauteur du défi que je me lance, mais j'aimerais bien tenter

    Merci par avance,
    Ero

  2. #2
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Après avoir fait plusieurs recherche sur ProcessInformation et autre idée de ce style, je ne sais toujours pas dans quelle direction chercher avec quels mots clés

    En fait, mon but serai de reproduire un peu le style de TaskBar.
    Je m'étais toujours demandé comment ils arrivaient à dire que l'application untel devait se réduire dans la barre des tâches du moniteur sur lequel elle se trouve.

    Merci

  3. #3
    Membre confirmé
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Février 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 537
    Points : 460
    Points
    460
    Par défaut
    Peut-être que je répond à côté de la plaque mais bon...
    Il me semble que lorsque l'on lance un soft sur ce genre de config, il ne réagit pas comme si il y avait 2 écrans mais comme si il n'y en avait qu'un mais très large.
    Donc pour savoir sur quel écran il doit se lancer la prochaine fois, il garde juste en paramètre sa position sur ce grand écran en mémoire.

    Je dis ça mais je ne suis vraiment pas sur de moi

    André

  4. #4
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Ah, peut-être oui
    Donc le truc à faire, si j'ai bien compris, ça serait de faire un service qui scrute chaque process et dès, qu'un nouvelle process est lancé, on lui fait un setTop et un setLeft (en gros) pour qu'il se positionne là où il faut.
    C'est bien dans cette direction que je dois regarder ?

    Par contre, je ne vois pas comment dire à l'application lancée :
    Si tu es sur le second moniteur, tu te réduis dans la barre des tâches du second moniteur...
    Je creuse encore

    En tout cas, merci pour l'info

  5. #5
    Membre confirmé
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Février 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 537
    Points : 460
    Points
    460
    Par défaut
    Je n'ai pas de configuration double écran chez moi, mais pour valider ce que je pense je ferais une simple petite application qui indiquerait sa position, dans 2 labels, à chaque changement.
    Ainsi, une fois la piste validée, on serait par où continuer.

    Je te l'ai dit, je ne suis pas certain...

    André

  6. #6
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 947
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 947
    Points : 15 403
    Points
    15 403
    Par défaut
    Yop !

    Idée rapide du boulot, donc sans Delphi sous la main...

    Jette un oeil aux options de position de ta form, il me semble qu'il y a une propriété "Default monitor", tu sais, là où on peut demander un centrage sur le Bureau, l'emplacement par design, etc. (propriété "position" ? Me rappelle pas). Ça te mettra peut-être sur la piste...

    Bonne journée,

  7. #7
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Yop Jipété

    Citation Envoyé par Jipété Voir le message
    Yop !

    Idée rapide du boulot, donc sans Delphi sous la main...

    Jette un oeil aux options de position de ta form, il me semble qu'il y a une propriété "Default monitor", tu sais, là où on peut demander un centrage sur le Bureau, l'emplacement par design, etc. (propriété "position" ? Me rappelle pas). Ça te mettra peut-être sur la piste...

    Bonne journée,
    Oui oui, tu as raison, le DefautMonitor est bien présent dans les options de la Form, en revanche, c'est la récupération de cette application qui me pose soucis, car cela doit être possible via une application tiers.

    Les valeurs prises sont celles-ci :
    dmDesktop La fiche n'est pas placée dans un moniteur particulier.
    dmPrimary La fiche est placée dans le premier écran énuméré dans la propriété Monitors de l'objet global écran.
    dmMainForm La fiche apparaît dans le même écran que la fiche principale de l'application.
    dmActiveForm La fiche apparaît dans le même écran que la fiche active en cours.

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 815
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 815
    Points : 13 531
    Points
    13 531
    Par défaut
    Pour savoir sur quel moniteur se trouve un point, tu as Screen.MonitorFromPoint .

    Et pour une fenêtre, Screen.MonitorFromWindow.

  9. #9
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Bonjour Andnotor ,

    Citation Envoyé par Andnotor Voir le message
    Pour savoir sur quel moniteur se trouve un point, tu as Screen.MonitorFromPoint .

    Et pour une fenêtre, Screen.MonitorFromWindow.
    Content de te voir participer au sujet
    Je vais regarder ces méthodes dès que possible !

    Ca m'a l'air d'être tout ce que j'attends !

    Merci bien

  10. #10
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Bonsoir,

    Désolé de ne pas avoir donné de nouvelles avant aujourd'hui ...
    La fonction d'Andnotor correspond à mon besoin, c'est tout ce dont j'attendais

    Par contre, j'ai un petit soucis qui est assez handicapant tout de même
    Je n'arrive pas à retrouve le Handle de n'importe quelle application via son idProcess ...

    J'avais vu dans la FAQ une entrée, mais j'ai un soucis pour le déplacement de la fenêtre... En effet, j'ai comme une seconde fenêtre sur fond bleu qui est créée au même endroit que la fenêtre déplacée. Elle est située en dessus de l'application déplacé..

    Le code ressemble à ceci :
    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
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls,TlHelp32,Math ;
     
    type
      PFindWindowsStruct = ^TFindWindowsStruct;
      TFindWindowsStruct = record
        ProcessID: DWORD;
        HandleList: TList;
      end;
     
     TProcessInformations = record
       ProcessID : DWORD;
       ProcessHandle : THandle;
     end;
     
     
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        GroupBox1: TGroupBox;
        GroupBox2: TGroupBox;
        StaticText1: TStaticText;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        StaticText2: TStaticText;
        StaticText3: TStaticText;
        Label4: TLabel;
        StaticText4: TStaticText;
        GroupBox3: TGroupBox;
        Button2: TButton;
        Label5: TLabel;
        Label6: TLabel;
        Edit2: TEdit;
        Edit3: TEdit;
        Label7: TLabel;
        Label8: TLabel;
        Edit4: TEdit;
        Edit5: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    function EnumWindowsProc(hwnd: HWND; lParam: LPARAM): boolean; stdcall;
    var
      dwProcessId: DWORD;
    begin
      if lParam <> 0 then
      begin
        GetWindowThreadProcessId(hwnd, dwProcessId);
        with PFindWindowsStruct(lParam)^ do
          if dwProcessID = ProcessID then
            HandleList.Add(Pointer(hwnd));
        result:= true;
      end
      else
        result:= false;
    end;
     
    procedure FindProcessWindows(ProcessID: Integer; Handles: TList);
    var
      findWindowsStruct: TFindWindowsStruct;
    begin
      findWindowsStruct.ProcessID:= ProcessID;
      findWindowsStruct.HandleList:= Handles;
      EnumWindows(@EnumWindowsProc, Integer(@findWindowsStruct));
    end;
     
    function getProcessID(const ProcessName : string) : TProcessInformations;
    var ProcessEntry32 : TProcessEntry32;
        HSnapShot : THandle;
        HProcess : THandle;
    begin
      Result.ProcessID := 0;
      Result.ProcessHandle := INVALID_HANDLE_VALUE;
     
      HSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      if HSnapShot = 0 then exit;
     
      ProcessEntry32.dwSize := sizeof(ProcessEntry32);
      if Process32First(HSnapShot, ProcessEntry32) then
      repeat
        if CompareText(ProcessEntry32.szExeFile, ProcessName) = 0 then
        begin
          HProcess := OpenProcess(PROCESS_TERMINATE, False, ProcessEntry32.th32ProcessID);
          Result.ProcessHandle := HProcess;
          Result.ProcessID := ProcessEntry32.th32ProcessID;
          CloseHandle(HProcess);
          Break;
        end;
      until not Process32Next(HSnapShot, ProcessEntry32);
      CloseHandle(HSnapshot);
    end;
     
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
     handles: TList;
     i : integer;
    begin
      handles:= TList.Create;
        try
          FindProcessWindows(getProcessID(Edit1.Text).ProcessID, handles);
          for i := 0 to handles.Count - 1 do
          begin
            if(IsWindow(Integer(handles[i])))then
              MoveWindow (Integer(handles[i]),StrToInt(Edit2.Text),StrToInt(Edit3.Text),StrToInt(Edit4.Text),StrToInt(Edit5.Text),true);
          end;
        finally
          handles.Free;
        end;
    end;
     
    end.
    Si vous avez une idée sur la façon de récupérer la fenêtre principale de l'application à partir du ProcessID

    Merci

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

Discussions similaires

  1. Récupérer l'élément sur lequel se trouve la souris
    Par Landrya dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/01/2010, 08h29
  2. TreeView, récupérer le TreeViewItem sur lequel se trouve la souris
    Par Harry_polin dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 30/11/2009, 11h01
  3. Réponses: 25
    Dernier message: 15/07/2007, 12h41
  4. Réponses: 1
    Dernier message: 24/01/2007, 18h20
  5. Comment récupérer les coordonnées sur le bureau d'une form ?
    Par fma2112 dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 22/02/2006, 23h43

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