Passage sous linux difficile...

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

4 réponses

  1. (merci à jipicy pour la mise en forme, je ne savais pas comment faire :3 ) ! :D
    1. Contributeur
      Ben, il va falloir que tu refasses tout...
      Ton programme est propre à Windows. puisqu'il se base sur des bibliothèques de Windows.
      1. D'accord...
        Et, est ce que tu connais un équivalent à ces fonctions sous linux ?
        Spécialement : hwnd, ShowWindow(), et BringWindowToTop().

        Merci :)
        1. Contributeur
          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 ;-).
        2. 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
        3. Contributeur
          @AntoineprogCe 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.
        4. 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...
      2. Contributeur
        '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é).