Passage sous linux difficile...

Antoineprog Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   -  
ElementW Messages postés 4814 Date d'inscription   Statut Contributeur Dernière intervention   -
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   Statut Membre Dernière intervention   2
 
(merci à jipicy pour la mise en forme, je ne savais pas comment faire :3 ) ! :D
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention   2
 
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention   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
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846 > Antoineprog Messages postés 12 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   2
 
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   Statut Contributeur Dernière intervention   1 846
 
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 4814 Date d'inscription   Statut Contributeur Dernière intervention   1 223
 
'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