Page 1 sur 1

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

Posté : mer. 18 mars 2009 19:53
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

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

Posté : jeu. 19 mars 2009 15:41
par guilix
pas de solutions?

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

Posté : jeu. 19 mars 2009 16:02
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:

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

Posté : jeu. 19 mars 2009 16:05
par guilix
enfaite j'aimerai ouvrir un programme dans chaque onglet. est-ce possible?

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

Posté : jeu. 19 mars 2009 17:28
par Yogui
En première lecture je dirai non ... pas possible avec des exe...

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

Posté : mer. 25 mars 2009 20:28
par guilix
donc? impossible?

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

Posté : mer. 25 mars 2009 20:32
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.

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

Posté : mer. 25 mars 2009 22:25
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 ^^

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

Posté : mer. 25 mars 2009 23:27
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 .°°°°

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

Posté : jeu. 26 mars 2009 13:34
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

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

Posté : jeu. 26 mars 2009 19:08
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


 

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

Posté : dim. 26 juil. 2009 13:38
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