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 -
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 :
Merci beaucoup !!!!
Cordialement
Antoine
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:
- Passage sous linux difficile...
- Passage qwerty azerty - Guide
- Linux reader - Télécharger - Stockage
- Toutou linux - Télécharger - Systèmes d'exploitation
- Backtrack linux - Télécharger - Sécurité
- R-linux - Télécharger - Sauvegarde
4 réponses
Ben, il va falloir que tu refasses tout...
Ton programme est propre à Windows. puisqu'il se base sur des bibliothèques de Windows.
Ton programme est propre à Windows. puisqu'il se base sur des bibliothèques de Windows.
D'accord...
Et, est ce que tu connais un équivalent à ces fonctions sous linux ?
Spécialement : hwnd, ShowWindow(), et BringWindowToTop().
Merci :)
Et, est ce que tu connais un équivalent à ces fonctions sous linux ?
Spécialement : hwnd, ShowWindow(), et BringWindowToTop().
Merci :)
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 ;-).
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 ;-).
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 ;-)
Et plus particulièrement :
https://gtk.developpez.com/cours/gtk2/?page=page_2
Bon courage ;-)
'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
Avec xlib:
Pour énumérer les fenêtres, il faut se servir de XQueryTree avec comme paramètre
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é
PID dont tu peux avoir toutes les infos via le dossier
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é).
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
xcbou
xlib.
Avec xlib:
Pour énumérer les fenêtres, il faut se servir de XQueryTree avec comme paramètre
wla 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_PIDde 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
exesur lequel il faut effectuer un
readlinkpour 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é).