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 :

Win64 TaskBar - TNotifyIconData


Sujet :

Delphi

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Win64 TaskBar - TNotifyIconData
    Bonjour,

    Je suis nouveau ici et je suis également a mes premiers pas sur Delphi pascal.
    Pour mon premier Dev, je suis parti des sources Delphi 2007 d'un ancien ami (Je n'ai pas réussi à le contacter) et j'essaye de le convertir vers Delphi XE et Win64. Dans un premier temps !
    L'appli crée une barre des tâches avec Shell API, Class Shell_TrayWnd, TsRebarWnd, TrayNotifyWnd et CreateWindowEx, WindowProc, SendMessage. Il n'est sans doute pas le plus simple pour mon démarrage sur Delphi

    Nom : Basic_TaskBar.jpg
Affichages : 326
Taille : 31,8 Ko

    Après quelques efforts, la version 32-bit fonctionne mais je n'arrive pas a la faire fonctionner la version 64-bit
    Voici là ou je bloque actuellement, dans Tray.pas

    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
    type
      PTrayNotifyCDS  = ^TTrayNotifyCDS;
      TTrayNotifyCDS = record
        cookie: DWORD;
        notify_code: DWORD;
        nicon_data: TNotifyIconData;
     end;
     
    function OnCopyData(hWnd: HWND; wParam: WPARAM; lParam: LPARAM): LRESULT;
    var
      pcd: PCopyDataStruct;
      TnCDS: PTrayNotifyCDS;
      NID: NotifyIconData;
     
    begin
      Result := 1;
      pcd := PCopyDataStruct(lParam);
      if pcd^.dwData = 1 then begin
        TnCDS:=PTrayNotifyCDS(pcd.lpData);
        nid:=TnCDS^.nicon_data;
        if nid.cbSize >= TNotifyIconData.SizeOf then
     
        case TnCDS^.notify_code of
             NIM_ADD:
    En 64-bit nid.cbSize = 956 alors que TNotifyIconData.SizeOf = 976 et les données sont décalées.
    Voici les sources du projet pour ceux qui sont intéressés
    TaskBar.7z

    Merci pour votre aide

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Hum, j'ai sans doute mal présenté mon souci pour être aider
    Je précise que j'ai déjà fait plusieurs modif (dans le projet partagé ci-dessus) pour pouvoir compiler le programme en 64-bits et pour qu'il fonctionne.
    Cependant, je bloque toujours sur la zone de notification. Il semble être un soucis suite à la copie de la DataStructure WM_COPYDATA dans la structure TNotifyIconData !

    J'aurais sans doute plus de chance avec ce source beaucoup plus léger et plus facile à débuguer
    Un bel exemple pour afficher dans une Form les Icônes de la zone de notification système via Shell_NotifyIconW.
    L'exemple fonctionne bien en 32-bit. Pas de problème en x64 pour le compiler et le lancer mais je reproduis le même soucis avec les données dans la structure NotifyIconData!

    Page de l'exemple: http://www.delphiworld.narod.ru/base/shell_tray.html
    et le source du projet de démonstration: http://www.delphiworld.narod.ru/base...s/demotray.zip (10 Ko)

    Note: Pour le lancer (32 ou 64), il faut arrêter au préalable le process explorer.exe via TaskMgr.
    et toujours dans le gestionnaire des tâches, utiliser "Fichier/Nouvelle tâche" et exécuter explorer.exe pour relancer le Shell après le Test/Débug.

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    Y aurait-il une différence de taille des données UINT et HWND de la déclaration de NOTIFYICONDATA entre versions 32 et 64 bits ? Du style un écart de 4 à 8 octets, soit 5*4=20 octets en plus ?

    Dans ce cas, un essai en remplaçant par DWORD le ferait-il ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci
    Il semble bien s'agir bien d'un décalage de quelques octets entre 32 et 64 bit.
    J'ai ajouté la déclaration de NotifyIconData en interne, puis en essayant avec DWORD mais sans succès pour l'instant.
    Comme je l'ai dit dans mon premier post, je suis débutant, il va peut falloir que je commence par des choses plus facile

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    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
    function OnCopyData(hWnd: HWND; wParam: WPARAM; lParam: LPARAM): LRESULT;
    var
      pcd: PCopyDataStruct;
      TnCDS: PTrayNotifyCDS;
      NID: NotifyIconData;
    //...
    begin
      FillChar(NID, SizeOf(TNotifyIconData), 0); // pourquoi ici ? Et pourquoi avec SizeOf(TNotifyIconData) et non TNotifyIconData.SizeOf ?
      Result := 1;
      pcd := PCopyDataStruct(lParam);
      if pcd^.dwData = 1 then begin // qui envoie ces messages en settant à 1 ?
        TnCDS:=PTrayNotifyCDS(pcd.lpData); // que vaut pcd^.cbData ? en principe, taille de lpData, soit ici TNotifyIconData.SizeOf 
        NID:=TnCDS^.nicon_data;
        if NID.cbSize >= TNotifyIconData.SizeOf then
     
        case TnCDS^.notify_code of
             NIM_ADD:
             begin
              Result := 1;
              NewTrayIcon(NID);
             end;
     
            NIM_DELETE:
             begin
              Result := 1;
              DeleteTrayIcon(NID);
             end;
     
           NIM_MODIFY:
             begin
                ModifyTrayIcon(NID);
                Result := 1;
            end;
     
          end;
       end;
    end;
    En te basant sur NOTIFYICONDATA.szInfoTitle TCHAR[64], peux-tu vérifier le décalage ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Y aurait-il une différence de taille des données UINT et HWND de la déclaration de NOTIFYICONDATA entre versions 32 et 64 bits ? Du style un écart de 4 à 8 octets, soit 5*4=20 octets en plus ?

    Dans ce cas, un essai en remplaçant par DWORD le ferait-il ?
    En continuant sur cette voie, merci , j'ai également remplacé HICON par DWORD.
    et maintenant, je n'ai plus l'écart, le décalage et les icones du systray s'affiche maintenant à la fois en 32 et 64 bit. Whaouuuu
    Un peu de mal a bien comprendre , cependant, voici la structure déclaré en interne:

    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
    type
      PNotifyIconDataA = ^TNotifyIconDataA;
      PNotifyIconDataW = ^TNotifyIconDataW;
      PNotifyIconData = PNotifyIconDataW;
      _NOTIFYICONDATAA = record
        cbSize: DWORD;
        Wnd: DWORD;
        uID: DWORD;
        uFlags: UINT;
        uCallbackMessage: UINT;
        hIcon: DWORD;
        szTip: array [0..127] of AnsiChar;
        dwState: DWORD;
        dwStateMask: DWORD;
        szInfo: array [0..255] of AnsiChar;
        case Integer of
          0: (
            uTimeout: UINT);
          1: (uVersion: UINT;
            szInfoTitle: array [0..63] of AnsiChar;
            dwInfoFlags: DWORD;
            guidItem: TGUID;        // Requires Windows Vista or later
            hBalloonIcon: DWORD);   // Requires Windows Vista or later
      end;
      _NOTIFYICONDATAW = record
        cbSize: DWORD;
        Wnd: DWORD;
        uID: DWORD;
        uFlags: UINT;
        uCallbackMessage: UINT;
        hIcon: DWORD;
        szTip: array [0..127] of WideChar;
        dwState: DWORD;
        dwStateMask: DWORD;
        szInfo: array [0..255] of WideChar;
        case Integer of
          0: (
            uTimeout: UINT);
          1: (uVersion: UINT;
            szInfoTitle: array [0..63] of WideChar;
            dwInfoFlags: DWORD;
            guidItem: TGUID;        // Requires Windows Vista or later
            hBalloonIcon: DWORD);   // Requires Windows Vista or later
      end;
      _NOTIFYICONDATA = _NOTIFYICONDATAW;
      TNotifyIconDataA = _NOTIFYICONDATAA;
      TNotifyIconDataW = _NOTIFYICONDATAW;
      TNotifyIconData = TNotifyIconDataW;
      NOTIFYICONDATAA = _NOTIFYICONDATAA;
      NOTIFYICONDATAW = _NOTIFYICONDATAW;
      NOTIFYICONDATA = NOTIFYICONDATAW;

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    Pas simple de savoir pourquoi certains champs semblent tantôt sur 4 octets, tantôt sur 8 pour une définition a priori identique de Handle ou UINT...
    Restons pragmatiques : du moment que ça colle !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

Discussions similaires

  1. Réponses: 9
    Dernier message: 27/04/2011, 14h54
  2. Détecter click sur le bouton de l'application dans Taskbar
    Par bob2553 dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 22/08/2005, 22h34
  3. Changer la taille et/ou pos de la taskBar
    Par Sunny dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 28/07/2005, 16h15
  4. Réponses: 5
    Dernier message: 02/08/2004, 17h11
  5. [Toolkit] setSize() tenir compte de la taskbar
    Par Stessy dans le forum AWT/Swing
    Réponses: 19
    Dernier message: 22/01/2004, 10h00

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