Ouvrir une fenêtre (ecran) extern ds un programme purebasic

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Ouvrir une fenêtre (ecran) extern ds un programme purebasic

Message par blendman »

Salut

Savez-vous comment je peux faire pour ouvrir l'intérieur d'une fenêtre d'un programme dans purebasic.

Par exemple, avec Runprogram() j'ouvre wordpad, et j'affiche wordpad (uniquement l'intérieur de la fenêtre) dans mon programme purebasic puis j'agis dessus en récupérant des informations.
Evidemment, ce n'est pas avec wordpad ^^, c'est pour me faire un éditeur de niveau 3D utilisant un moteur de jeu dont j'ai la licence.
Je voudrais utiliser l'affichage de ce moteur de jeu (un .exe) et ajouter des gadgets pour pouvoir ajouter des objets, les modifier, les bouger, changer les sahders/textures, les lights, etc...

Vous savez si c'est possible et si oui, comment je peux faire ça ?

merci.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Ouvrir une fenêtre (ecran) extern ds un programme pureba

Message par Ar-S »

Ma théorie :
Je dirai déjà que ce sera du windows only car tu vas devoir te taper de l'API SendMessage_ à gogo, ne serait-ce que pour lier ta fenêtre PB à ta fenêtre externe.
Ensuite, si ton exe moteur accepte les lignes de commandes, tu pourras logiquement communiquer avec les bouton de ta fenêtre PB qui échangeront des instructions via #PB_Program_Open/read/write
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Ouvrir une fenêtre (ecran) extern ds un programme pureba

Message par Zorro »

et hop !

Code : Tout sélectionner

; mettre un prg dans sa propre fenetre
#APPNAME1 = "Calculatrice"

Define *Parent
Global *Child


Procedure MyWindowCallback(hWnd, uMsg, wParam, lParam)
    result = #PB_ProcessPureBasicEvents
    Select uMsg
        Case #WM_PAINT
            RedrawWindow_(*Child, 0, 0, #RDW_INVALIDATE|#RDW_ERASE|#RDW_FRAME)
    EndSelect
    ProcedureReturn result
EndProcedure


*Child = FindWindow_(0, #APPNAME1)
If Not *Child
    RunProgram("calc.exe") : Delay(1000)
    *Child = FindWindow_(0, #APPNAME1)
    If Not *Child
        MessageRequester("Error", #APPNAME1 + " must be running !")
        End
    EndIf
EndIf

*Parent = OpenWindow(0, 0, 0, 320, 240, "Master", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget)

If *Parent
    
    SetWindowColor(0, $AAAAAA)
    
    CreateStatusBar(0, WindowID(0))
    
    SetParent_(*Child, WindowID(0))
    SetWindowPos_(*Child, 0, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_SHOWWINDOW)
    SetWindowCallback(@MyWindowCallback())
    
    Repeat
        
        Select WaitWindowEvent()
                
            Case #PB_Event_CloseWindow
                If IsWindow_(*Child)
                    SetParent_(*Child, 0)
                EndIf
                CloseWindow(0)
                Break
        EndSelect
        
    ForEver
    
EndIf

End
Image
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Ouvrir une fenêtre (ecran) extern ds un programme pureba

Message par blendman »

salut Zorro :)

Merci pour cet exemple ;), ça marche pas mal effectivement (j'avais vu ça sur le forum anglais).
Tu sais ensuite comment je peux faire pour envoyer des informations (text$ ou variable) dans la fenêtre de la calculette et récupérer des informations depuis la calculette vers ma fenêtre à moi ?

En fait , j'aimerai faire un éditeur de niveau 3D pour les jeux 3D que je réalise avec un game engine qui ne permet pas de faire facilement des interfaces type gadget/menu/ etc.. Pour ça, purebasic est excellent et j'aimerai l'utiliser avec en écran central le game engine (j'ai testé et ça marche super bien en fait ^^).
Mais je dois pouvoir interagir avec l'écran central (le game engine), en lui envoyant des infos :
- je clique dans ma fenêtre purebasic sur une checkbox (pour activer les ombres par exemple)
- j'envoie cette information dans l'écran central (la fenêtre game engine) : ombre active
- et paf, j'active les ombres dans l'écran game-engine :)

Une idée pour faire ça ?

merci beaucoup :D
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Ouvrir une fenêtre (ecran) extern ds un programme pureba

Message par Zorro »

blendman a écrit : Une idée pour faire ça ?
oui ! :)

il te faut utiliser un protocole de dialogue entre 2 applis les MailSlot

ton moteur et ton designer

pour ça il existe une methode (mais il y en a d'autre ) j'ai utilisé ça pour commander EPB

en clair c'est comme un disque Virtuel (une boite au lettres)
les deux application ecrivent dedans

pour echanger des données

apres c'est a toi de voir ce que tu fais de ces info

lance les 2 prg suivant et imagine que c'est ton moteur et ton designer


exemple :

prg Envoie :

Code : Tout sélectionner

Procedure Error(message$)
      wError = GetLastError_()
      If wError
            *ErrorBuffer = AllocateMemory(1024)
            message$+Chr(10)+PeekS(*ErrorBuffer, FormatMessage_(#FORMAT_MESSAGE_FROM_SYSTEM, 0, wError, 0, *ErrorBuffer, 1024, 0))
            FreeMemory(*ErrorBuffer)
      EndIf
      MessageRequester("Error", message$)
      End
EndProcedure
#file=1
If OpenWindow(1,320, 200, 320, 200,"Interprocess communications: Mailslot client",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
      If CreateGadgetList(WindowID(1))
            StringGadget(0, 8, 8, 304, 152, "")
            ButtonGadget(1, 8, 168, 64, 32, "Send")
            MailSlot$ = "\\.\mailslot\test"
            MailSlotData = RegisterWindowMessage_("DATASENT")
            Repeat
                  eventID = WaitWindowEvent()
                  Select eventID
                        Case #PB_Event_Gadget
                              If EventGadget()=1
                                    If OpenFile(#file, MailSlot$)
                                          WriteString(#file,GetGadgetText(0))
                                          CloseFile(#file)
                                          PostMessage_(#HWND_BROADCAST, MailSlotData, 0, 0)
                                    Else
                                          Error("OpenFile()")
                                    EndIf
                              EndIf
                        Case #PB_Event_CloseWindow
                              Quit = 1
                  EndSelect
            Until Quit
      EndIf
EndIf


prg recois

Code : Tout sélectionner

Procedure Error(message$)
      wError = GetLastError_()
      If wError
            *ErrorBuffer = AllocateMemory(1024)
            message$+Chr(10)+PeekS(*ErrorBuffer, FormatMessage_(#FORMAT_MESSAGE_FROM_SYSTEM, 0, wError, 0, *ErrorBuffer, 1024, 0))
            FreeMemory(*ErrorBuffer)
      EndIf
      MessageRequester("Error", message$)
      End
EndProcedure

MailSlot$ = "\\.\mailslot\test"
hMailslot = CreateMailslot_(MailSlot$, 0, #MAILSLOT_WAIT_FOREVER, #Null)
If hMailslot=#INVALID_HANDLE_VALUE:Error("CreateMailslot_()"):EndIf
If OpenWindow(0, 640, 200, 320, 200, "Interprocess communications: Mailslot server",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
      If CreateGadgetList(WindowID(0))
            TextGadget(0, 8, 8, 304, 192, "No waiting messages.")
            MailSlotData = RegisterWindowMessage_("DATASENT")
            Repeat
                  eventID = WaitWindowEvent()
                  Select eventID
                        Case MailSlotData
                              If GetMailslotInfo_(hMailslot, #Null, @cbMessage, @cMessage, #Null)=0:Error("GetMailslotInfo_()"):EndIf
                              If cbMessage<>#MAILSLOT_NO_MESSAGE
                                    While cMessage
                                          *Message = AllocateMemory(cbMessage+1)
                                          If ReadFile_(hMailslot, *Message, cbMessage, @cbRead, 0)=0:Error("ReadFile_()"):EndIf
                                          SetGadgetText(0, PeekS(*Message, cbRead))
                                          FreeMemory(*Message)
                                          fResult = GetMailslotInfo_(hMailslot, #Null, @cbMessage, @cMessage, #Null)
                                          If fResult=0:Error("GetMailslotInfo_()"):EndIf
                                    Wend
                              EndIf
                        Case #PB_Event_CloseWindow
                              Quit = 1
                  EndSelect
            Until Quit
      EndIf
EndIf
CloseHandle_(hMailslot)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Ouvrir une fenêtre (ecran) extern ds un programme pureba

Message par blendman »

salut

Encore merci Zorro ;)
J'ai testé et c'est pas mal du tout. En fait, j'avais pensé à un truc du genre (passer par le network comme un server-client classique), mais je ne savais pas que ça existait ^^.
Je crois que ça peut être une solution pour mes tests (voire plus).

Encore un grand merci ;).
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Ouvrir une fenêtre (ecran) extern ds un programme pureba

Message par blendman »

Ah mince, je viens de me rendre compte que je ne peux pas utiliser ça, car je n'ai pas ce "GetMailslotInfo_" dans mon gameengine ^^.
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Ouvrir une fenêtre (ecran) extern ds un programme pureba

Message par Zorro »

comprends pas

tu n'a pas acces aux sources ?
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Ouvrir une fenêtre (ecran) extern ds un programme pureba

Message par blendman »

Zorro a écrit :comprends pas

tu n'a pas acces aux sources ?
pas aux sources du gameengine ^^.
Je veux créer un editeur de niveau 3D avec pb, et utiliser dans celui-ci le "screen" du game engine que j'utilise (ce n'est pas moi qui ai fait ce game engine).
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Ouvrir une fenêtre (ecran) extern ds un programme pureba

Message par Zorro »

ha d'accords !

alors les 2 solution qui te restent c'est

1- le gars qui a cree le moteurs a prevu qu'on puisse le commander d'une façon ou une autre ....
faut lui demander

2- utiliser un hack ... c'est a dire taper dans les adresses du prg ... mais sans informations c'est pas gagner
surtout pour des choses aussi complexe

pour un jeux ou on poke une valeur pour passer a travers les murs, c'est deja pas tres simple, mais faisable par taton avec des soft de recherche comme Cheat Engine par exemple on repere l'adresse qui va bien, et on creer un prg qui va poser la bonne valeur

mais pour ton projet, c'est mort !!
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Ouvrir une fenêtre (ecran) extern ds un programme pureba

Message par blendman »

Je me suis mal exprimé ^^.
En fait, je peux faire beaucoup de chose, mais pas utiliser GetMailslotInfo_ (il s'agit d'agk). Par exemple, il y a des fonctions pour faire du multiplayer (socket, créer un server-client, envoyer & recevoir des messages, etc..), je peux aussi lire des fichiers ou écrire dedans, etc...
Evidemment, je peux charger des images, des modèles 3D, les afficher, créer et gérer des sprites, etc... Mais cette partie-là ne concerne pas trop la gestion-inter-fenêtre ^^.
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Ouvrir une fenêtre (ecran) extern ds un programme pureba

Message par Zorro »

donc ça reviens a demander aux Auteurs de Agk
le protocole de comunication avec leur moteur 3D

il y avait un gars sur le forum anglais qui avait fait un Wrapp du moteur 3D du Dark Basic
c'est le meme principe !

je suppose que AGK utilise un protocole de comunication entre leur editeur et le moteur au moment de la compilation

c'est la qu'il te faut chercher ...
prends d'abord un max d'info concernant agk (chez eux... leur forum )

car forcement le moteur 3D doit etre séparé ... comme Ogre avec Purebasic ...
c'ets au moment de la compilation que l'un parle avec l'autre


d'ailleurs ... pourquoi ne pas directement coder ton editeur 3D avec AGK
ça me semble le plus simple ... :)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Ouvrir une fenêtre (ecran) extern ds un programme pureba

Message par blendman »

Zorro a écrit :d'ailleurs ... pourquoi ne pas directement coder ton editeur 3D avec AGK
ça me semble le plus simple ... :)
C'est ce que j'ai fait au départ, mais il n'y a aucun gadget (c'est orienté jeu mobile essentiellement), donc, je suis obligé de tout coder moi-même : panelgadget, trackbar, checkbox, stringgadget, event, menu, etc... J'ai commencé, mais c'est vraiment pas terrible, je perds un temps fou à coder des gadgets et pas à avancer sur l'éditeur, alors qu'avec Purebasic, j'ai déjà tous les gadgets sous la main (ainsi que menu, eventwindow, eventgadget, etc...) et plein de fonctions très pratique, comme les requester par exemple. c'est pour ça que je voudrais utiliser le moteur de jeu pour l'affichage et la manipulation interne et purebasic pour la gestion de l'interface (gadget, menu, etc...)
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Ouvrir une fenêtre (ecran) extern ds un programme pureba

Message par Zorro »

je comprends, bon je ne vais pas pouvoir t'aider
je ne connais pas AGK , du reste je viens de regarder une video de demo
ça a l'air sympath a coder , on dirai du Basic :)

par contre tu me deçois en disant qu'il n'y a pas de gadget .... c'est vraiement dommage
j'aurai peut etre investi ... :)


[reedit]
ha mais c'est du DarkBasic ... ok je comprends :)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Ouvrir une fenêtre (ecran) extern ds un programme pureba

Message par blendman »

Zorro a écrit :je viens de regarder une video de demo
ça a l'air sympa a coder , on dirai du Basic :)
oui, c'est très proche du basic (on peut aussi coder en c++ si on veut, mais je préfère le basic c'est plus simple et je peux me concentrer sur le gameplay).
par contre tu me deçois en disant qu'il n'y a pas de gadget .... c'est vraiment dommage
j'aurai peut etre investi ... :)
En fait, il y a quelques gadgets, mais c'est très limité : virtualbutton, virtualjoystick, editbox (sorte de stringgadget) et message (messagerequester très simplifié), mais c'est tout ^^.
Je suis crée une lib avec plein de gadgets et pour les menus, statusbar, etc... mais je préfèrerai vraiment faire mon éditeur en pb :).

[reedit]ha mais c'est du DarkBasic ... ok je comprends :)
En fait, c'est publié par la même boîte qui a fait DB (qui n'existe plus d'ailleurs), mais ce n'est pas le même développeur qui fait AGK (il me semble). C'est très orienté mobile comme appli, même si on peut aussi faire du pc, mais les perf sont moins bonnes qu'avec purebasic.
Répondre