Passage sous linux difficile...

Fermé
Antoineprog Messages postés 12 Date d'inscription dimanche 26 avril 2015 Statut Membre Dernière intervention 10 mai 2015 - Modifié par jipicy le 9/05/2015 à 19:59
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 - 10 mai 2015 à 15:19
Bonjour,

J'essaye de compiler ce code sous ubuntu, mais ca ne marche pas. Pourriez vous, s'il vous plait, me venir en aide ?
DEBUT DU CODE :

HWND GetHwndFromPid(DWORD dwPid)//Sert pour remettre au premier plan un programme déjà executé
{
  DWORD dwProcessID;
  HWND hWnd = GetWindow(GetDesktopWindow(), GW_CHILD);

  while(hWnd){
    if(IsWindowVisible(hWnd)){
      GetWindowThreadProcessId(hWnd, &dwProcessID);
      if(dwProcessID == dwPid)
        break;
    }
    hWnd = GetWindow(hWnd, GW_HWNDNEXT);
  }

  return hWnd;
}

DWORD GetPidFromName(const char *szExeName)//Sert pour remettre au premier plan un programme déjà executé
{
  DWORD dwPID = 0;
  PROCESSENTRY32 pe;
  HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

  if(hSnap != INVALID_HANDLE_VALUE){
    pe.dwSize = sizeof(PROCESSENTRY32);
    if(Process32First(hSnap, &pe)){
      do{
        if(lstrcmpi(pe.szExeFile, szExeName) == 0){
          dwPID = pe.th32ProcessID;
          break;
        }
      }while(Process32Next(hSnap, &pe));
    }
    CloseHandle(hSnap);
  }

  return dwPID;
}




int main()
{
                            DWORD dwPid = GetPidFromName(chaineamettreaupremierplan);
                                if(dwPid){
                                    HWND hWnd = GetHwndFromPid(dwPid);
                                    if(hWnd){
                                        ShowWindow(hWnd, SW_RESTORE);
                                        BringWindowToTop(hWnd);
                                        fini2=true;
                                    }
                               }
}



Merci beaucoup !!!!
Cordialement
Antoine
A voir également:

4 réponses

Antoineprog Messages postés 12 Date d'inscription dimanche 26 avril 2015 Statut Membre Dernière intervention 10 mai 2015 2
Modifié par Antoineprog le 9/05/2015 à 20:07
(merci à jipicy pour la mise en forme, je ne savais pas comment faire :3 ) ! :D
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
9 mai 2015 à 22:06
Ben, il va falloir que tu refasses tout...
Ton programme est propre à Windows. puisqu'il se base sur des bibliothèques de Windows.
0
Antoineprog Messages postés 12 Date d'inscription dimanche 26 avril 2015 Statut Membre Dernière intervention 10 mai 2015 2
9 mai 2015 à 22:11
D'accord...
Et, est ce que tu connais un équivalent à ces fonctions sous linux ?
Spécialement : hwnd, ShowWindow(), et BringWindowToTop().

Merci :)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
9 mai 2015 à 23:25
Ces fonctions graphiques ne sont pas propres au kernel mais à l'interface graphique (KDE, GTK+, ...).
Tu es sur Ubuntu, donc plutôt GTK2+.
hwnd, n'est pas une fonction mais représente le handle d'une fenêtre
ShowWindow() est à remplacer par gtk_widget_show().
Pour le reste, je ne sais pas trop. De toute façon, il te faut apprendre la programmation GTK2+ de zéro, vu que beaucoup de choses changent.
L'avantage, c'est que la nouvelle mouture de ton programme (sur GTK2+) fonctionnera aussi sur Windows ;-).
0
Antoineprog Messages postés 12 Date d'inscription dimanche 26 avril 2015 Statut Membre Dernière intervention 10 mai 2015 2
10 mai 2015 à 01:16
Non en fait, je vais passer sous lubuntu, donc LXKDE.
J'ai cherché des tutos pour la programmation KDE mais je n'en ai trouvé aucun, une idée ? :p
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840 > Antoineprog Messages postés 12 Date d'inscription dimanche 26 avril 2015 Statut Membre Dernière intervention 10 mai 2015
10 mai 2015 à 01:35
Ce n'est pas LXKDE sous lbuntu, mais LXDE, qui n'a rien à voir avec KDE.
LXDE utilise GTK+. Si tu veux KDE, utilise plutôt Kubuntu.
0
Antoineprog Messages postés 12 Date d'inscription dimanche 26 avril 2015 Statut Membre Dernière intervention 10 mai 2015 2
10 mai 2015 à 11:04
Ah d'accord ! Merci beaucoup :)
Donc il faut que j'apprenne à coder sous GTK+. Est ce que tu aurais quelques tutos ou conseils sous la main s'il te plait ? Je m'y connais pas trop en codage hors windows...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
10 mai 2015 à 13:12
Voici un ensemble de tuto : https://gtk.developpez.com/cours/
Et plus particulièrement :
https://gtk.developpez.com/cours/gtk2/?page=page_2
Bon courage ;-)
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
10 mai 2015 à 15:19
'lut, pour compléter la réponse de fiddy, ce code est très spécifique à Windows et il faut tout refaire.
Mais ici les fonctions utilisées agissent sur d'autres processus, et les bibliothèques d'interface (GTK, QT, wx, ...) ne permettent pas ça car elles sont chargées de s'occuper de leur propres fenêtres, et c'est tout.
Ce qu'il faut utiliser, ce sont les fonctions manipulant directement X11, soit utiliser
xcb
ou
xlib
.

Avec xlib:
Pour énumérer les fenêtres, il faut se servir de XQueryTree avec comme paramètre
w
la fenêtre racine de l'affichage (Display) actuel obtenu via la macro XRootWindow. Je ne crois pas qu'il liste toutes les fenêtres; il faut donc s'attendre à faire un usage récursif de ces fonctions.
Et ici, tout devient incertain: en fait, X11 étant conçu pour être utilisé en réseau, il se peut qu'effectivement aucun processus local ne soit associé à une fenêtre. Heureusement dans la plupart des cas la propriété
_NET_WM_PID
de la fenêtre contient le PID du processus.
PID dont tu peux avoir toutes les infos via le dossier
/proc/[PID]/
et ses différents fichiers virtuels, dont
exe
sur lequel il faut effectuer un
readlink
pour retrouver l'emplacement de l'exécutable.

Bref, c'est pas facile a faire, et c'est volontaire: on ne touche pas aux autres fenêtres normalement (sur ce point, Windows et son API est un vrai trou de sécurité).
0