[R] Ouvrir un exe dans un programme en autoit...

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
guilix
Niveau 1
Niveau 1
Messages : 6
Enregistré le : mer. 18 mars 2009 19:30
Status : Hors ligne

[R] Ouvrir un exe dans un programme en autoit...

#1

Message par guilix »

Bonjour, voila se la fait un moment que j'essaye de réaliser un petit programme permetant d'ouvrir dans chacun de ces onglets un programmes pour éviter de surcharger mon bureaux... J'ai créer la gui et commencer le code mais malheureusement je n'arrive pas ouvrir des fichier .exe dans chacun des onglets... Le maximum que j'ai put fair pour le moment c'est de les ouvrir en dehors du programme... Voila j'espère que vous pourrai m'aider . Ha oui merci d'avance
guilix
Niveau 1
Niveau 1
Messages : 6
Enregistré le : mer. 18 mars 2009 19:30
Status : Hors ligne

Re: [..]Ouvrir un exe dans un programme en autoit...

#2

Message par guilix »

pas de solutions?
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

Re: [..]Ouvrir un exe dans un programme en autoit...

#3

Message par Yogui »

Des solutions non mais une ou deux questions :

Vous voulez ouvrir des logiciels dans des onglets ? ou vous voulez qu'un logiciel s'ouvre lorsque vous cliquez sur un onglet ?
:mrgreen:
guilix
Niveau 1
Niveau 1
Messages : 6
Enregistré le : mer. 18 mars 2009 19:30
Status : Hors ligne

Re: [..]Ouvrir un exe dans un programme en autoit...

#4

Message par guilix »

enfaite j'aimerai ouvrir un programme dans chaque onglet. est-ce possible?
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

Re: [..]Ouvrir un exe dans un programme en autoit...

#5

Message par Yogui »

En première lecture je dirai non ... pas possible avec des exe...
guilix
Niveau 1
Niveau 1
Messages : 6
Enregistré le : mer. 18 mars 2009 19:30
Status : Hors ligne

Re: [..]Ouvrir un exe dans un programme en autoit...

#6

Message par guilix »

donc? impossible?
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..]Ouvrir un exe dans un programme en autoit...

#7

Message par GaRydelaMer »

bonsoir

ce qu'il veut dire c'est que un programme c'est vague, un programme c'est un ensemble de fonctions d'actions et de réactions.

Donc a toi d'être plus clair qu'elle fonctions dans les onglets.
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..]Ouvrir un exe dans un programme en autoit...

#8

Message par sylvanie »

Bonsoir,
+1 pour moi sur l'impossibilité avec un .exe

par contre si il existe un objet com associé à l'exe tel qu'un ocx installé dans la foullé, alors on peut l'utilisé via un GUICtrlCreateObj.
Pour voir un exple, il suffit de voir l'aide de cette fonction justement.
On cré une instance d'un objet de type internet explorer (donc ici on ne lance pas iexplore.exe, mais on lance une instance Shell.Explorer) et à ce moment là on peut "encapsuler cet objet dans l'interface autoit.

Une autre façon de "jouer" avec ce concept est de lancer l'outil de GUI koda, et de créé une zone "Com object", puis cliquer sur "..." en face de "Axobject". Une liste des objet com installer apparaîtra. Elle n'est pas exhaustive vis à vis de tous les ocx / dll existant sur le pc, mais au moins ça aide à voir où on va.

Après la difficulté est "qu'est ce qu'il existe comme actions liées à l'objet". Et bien là c'est la doc (si il y a), google, ou certains outils d'exploration d'objet com (j'aime bien celui-ci : http://www.mitec.cz/Downloads/OLExp.zip , d'ailleurs il y a pleins de soft sympas du même goût)

Bref bonne chance ^^
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..]Ouvrir un exe dans un programme en autoit...

#9

Message par ani »

hm hm
D'après mes souvenirs qui sont fort lointain, il est tout à fait possible (apart avec l'objet)
Il suffit simplement à la gui principal d'etre parent et le handle (autre fenetre) soit enfant.
teintein!!

Exemple (1)

Code : Tout sélectionner

$GuiParent = GuiCreate("Parent & Enfant",650, 319,-1,-1,BitOr($WS_CLIPCHILDREN,$WS_SYSMENU))
GUISetState(@SW_SHOW)

shellexecute("write","","","",@SW_HIDE)
$Enfant = WinGetHandle("Document - WordPad")
DllCall("user32.dll", "int", "SetParent", "hwnd",$Enfant, "hwnd",$GuiParent) 
WinSetState($Enfant,"",@SW_SHOWMAXIMIZED)

Do
Sleep(10)
Until GuiGetMsg() =-3
Exemple (2)
idem que le premier mais il faut cette fois utiliser setwindowlong pour attribuer a la fenetre enfant le style d'extension $WS_EX_MDICHILD
Y aura pas d'exemple ...

Conclusion = Ne dite pas que c'est pas possible lol

bonne continuation .°°°°
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..]Ouvrir un exe dans un programme en autoit...

#10

Message par ani »

vla un exemple du fofo anglais, j'ai rajouté SYSMENU (petit croix) et changer notepad en wordpad.

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hGUI = GUICreate("WorPad", 633, 454, 193, 125, BitOR($WS_SYSMENU,$WS_CLIPCHILDREN))
GUISetState(@SW_SHOW)

Run("write") ; on peut indiquer @sw_hide
WinWaitActive("Document - WordPad")
$WorPad= WinGetHandle("Document - WordPad")
_SetParent($WorPad, $hGUI)
WinSetState($WorPad, "", @SW_SHOWMAXIMIZED)

Do
Sleep(10)
Until GuiGetMsg() =-3

Func _SetParent($id_child, $h_parent)
    If Not IsHWnd($h_parent) Then $h_parent = HWnd($h_parent)
    If Not IsHWnd($id_child) Then $id_child = GUICtrlGetHandle($id_child)
    If DllCall("user32.dll", "hwnd", "SetParent", "hwnd", $id_child, "hwnd", $h_parent) <> 0 Then
        Return 1
    Else
        seterror(1)
        Return 0
    EndIf
EndFunc
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..]Ouvrir un exe dans un programme en autoit...

#11

Message par sylvanie »

bien vu pour la méthode, mais le use case d'inclusion dans une GUI est plus facile que dans un contrôle de type tab :

l'astuce réside à déclarer l'handle de l'exe en tant qu'enfant du handle "windows" de la gui entière (cas de l'exemple) ou d'un contrôle (notre cas avec le tab)

Le soucis du tab, est qu l'handle windows couvre le tab entier, du coups tous les tabitems ont le même handle.

La grosse bidouille consiste alors à faire l'insertion du handle de l'exe 1 après la création du tabitem1, l'exe 2 après le tabitme2 ...
Et là, oh rage, oh désespoire, il va falloire jongler avec le masquage des différents exe en fonction du tabitem sélectionné, car on, perds la souplesse "automatique" gérée par autoit.

voici un exple en tabitem avec les contraintes suivante :
- le refresh des déplacement a des lacunes, faut recliquer sur les tabitem pour "bien" repeindre, surtout pour wordpad ...
- j'ai fait un décalage volontaire des gui venant des "exe" passé en maximize, car sinon on ne peut plus cliquer sur les tabitem (sauf en déplaçant les gui)
- effet de bords : quand j'appel "write" j'ai un crash d'extinction", d'où l'appel direct en chemin absolu à wordpad (sans doute dû au pid renvoyé qui doit être celui d'un wrapper et non celui de wordpad, mais bon, là on s'écarte) :

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiTab.au3>

$pid_paint = Run("mspaint.exe")
$pid_word = Run("C:\Program Files\Windows NT\Accessoires\wordpad.exe")
Sleep(2000)
$GuiParent = GUICreate("Parent & Enfant", 650, 319, -1, -1, BitOR($WS_CLIPCHILDREN, $WS_SYSMENU))
$tabini = GUICtrlCreateTab(2, 2, 620, 250)
$tab = ControlGetHandle("Parent & Enfant", "", "[CLASS:SysTabControl32; INSTANCE:1]")
$tab0 = GUICtrlCreateTabItem("wordpad")
ConsoleWrite($tab0 & @CRLF)
$Enfant = WinGetHandle("Document - WordPad")
DllCall("user32.dll", "int", "SetParent", "hwnd", $Enfant, "hwnd", $tab)
WinSetState($Enfant, "", @SW_SHOWMAXIMIZED)
WinMove($Enfant,"",30,30)
$tab1 = GUICtrlCreateTabItem("paint")
$Enfant2 = WinGetHandle("Sans titre - Paint")
DllCall("user32.dll", "int", "SetParent", "hwnd", $Enfant2, "hwnd", $tab)
WinSetState($Enfant2, "", @SW_SHOWMAXIMIZED)
WinMove($Enfant2,"",30,30)
WinSetState($Enfant2, "", @SW_HIDE)
WinSetState($Enfant, "", @SW_SHOW)
GUISetState(@SW_SHOW)
$msg = 0
While $msg <> $GUI_EVENT_CLOSE
        $msg = GUIGetMsg()
        Select
   Case $msg = $tabini
    switch_screen($tabini)
   Case Else
    ;
        EndSelect
WEnd
ProcessClose($pid_word)
ProcessClose($pid_paint)
    
exit 0
Func switch_screen($id_tab)
 Local $itemid=GUICtrlRead($id_tab)
 if $itemid = 0 Then
  WinSetState($Enfant2, "", @SW_HIDE)
  WinSetState($Enfant, "", @SW_SHOW)
 Else
  WinSetState($Enfant, "", @SW_HIDE)
  WinSetState($Enfant2, "", @SW_SHOW)
 EndIf
EndFunc


 
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [R] Ouvrir un exe dans un programme en autoit...

#12

Message par Iste »

Hum, et comment peut-on 'sortir' un des programme de l'exe autoit ?

Edit : Ha ben, _SetParent($win, 0) !
J'avais testé avec la valeur "", mais il semblerait que ca soit different
Signez ici
Répondre