activation de fenetres

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
manaraselen
Messages : 5
Inscription : dim. 09/sept./2007 18:17

activation de fenetres

Message par manaraselen »

Bonjour,

J'aimerais savoir si avec purebasic il est possible de faire facilement ce qui suit :

sur le bureau, j'ai deux fenetres d'ouvertes et j'aimerais tour à tour activer celles-ci, quand le point 100,100 devient de couleur blanche.

En gros, quand le point 100,100 de la fenetre 1 devient blanc, activer la fenetre 1. Quand le point 100,100 de la fenetre 2 devient blanc, activer la fenetre 2.

Voila.

Si en plus d'être possible, l'un de vous peut me filer le bout de code pour faire cela, ce serait le nirvana :)

Merci pour vos réponses futures :)
brossden
Messages : 821
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Peux tu nous dire sous quelle action le point 100,100 change de couleur

Un petit bout de code serait le bien venu même s'il ne fonctionne pas
Denis

Bonne Jounée à tous
Stefou
Messages : 234
Inscription : jeu. 18/janv./2007 14:08

Message par Stefou »

Désolé le temps me manque pour te faire un code !
Mais voilà un début de réponse, c'est un code qui récupère le dessin de l'écran. Une boucle permet de te renvoyer la couleur du point ou est la souris.
J'éspère que cela te permettra d'arriver à tes fins.
Bon courage.

Code : Tout sélectionner

Procedure CopieEcran(x=0,y=0,l=40,h=40)
  Debug l
  Debug h
  DC = GetDC_(0)
  CreateImage(0, l, h)
  Dessin = StartDrawing(ImageOutput(0))
  BitBlt_(Dessin, 0,0,l, h, DC, x,y, #SRCPAINT); | $40000000)
  StopDrawing()
  ReleaseDC_(0, DC)
  ;SaveImage(0, "c:\test.bmp")
  ;FreeImage(0)
  ProcedureReturn 0
  
EndProcedure
ProcedureDLL GetMouseX() ; Get the X coordinate of the mouse pointer
  Temp.POINT
  GetCursorPos_(Temp)
  ProcedureReturn Temp\x
EndProcedure
ProcedureDLL GetMouseY() ; Get the Y coordinate of the mouse pointer
  Temp.POINT
  GetCursorPos_(Temp)
  ProcedureReturn Temp\y
EndProcedure

id_im=CopieEcran(0,0,GetSystemMetrics_(#SM_CXSCREEN),GetSystemMetrics_(#SM_CYSCREEN))
If StartDrawing(ImageOutput(id_im))
Repeat
  Delay(10)
  Debug Str(GetMouseX())+" : "+Str(GetMouseY())+" / "+Str(Point(GetMouseX(),GetMouseY()))
  
ForEver
StopDrawing()
EndIf
brossden
Messages : 821
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Est ce que ce bout de code répond à ton problème ?

Code modif après repérage petit bug !

Code : Tout sélectionner

  OpenWindow(0, 0, 0, 800, 600, "Fenêtre 0", #PB_Window_TitleBar )
  OpenWindow(10, 100, 200, 240, 140, "Fenêtre 1", #PB_Window_TitleBar)
  CreateGadgetList(WindowID(10))
  ButtonGadget(11, 20, 20, 100, 30, "Ferme")
  OpenWindow(20, 400, 200, 240, 140, "Fenêtre 2", #PB_Window_TitleBar)
  CreateGadgetList(WindowID(20))
  ButtonGadget(21, 20, 20, 100, 30, "Ferme")
  Procedure Bascule(x)
    Protected Fen = 20, Inc, Col =0
    Repeat
      Box(92,92,16,16,RGB(Col,Col,Col))
      If Col = 0
        Inc = 1
      EndIf
      If Col = 255
        Inc  = -1
      EndIf
      Col + Inc
      Delay(1)
      SetWindowTitle(0,Str(Col))
    ForEver
  EndProcedure
  TH=CreateThread(@Bascule(),0)
  StartDrawing(WindowOutput(0))
  Box(90,90,20,20,100)
  Fen=20
  Fait.b =0
  Repeat
    Debug Point(100,100)
    If Point(100,100)=> RGB(250,250,250) And Fait =0
      If  Fen=10
        Fait = 1
        Fen=20
        SetActiveWindow(Fen)
      Else
        Fen=10
        Fait = 1
        SetActiveWindow(Fen)
      EndIf
    EndIf
    If Point(100,100) <= RGB(100,100,100) 
      Fait = 0
    EndIf
    WEvent = WindowEvent()
    GEvent = EventGadget()
    Select GEvent
      Case 11
        AnimateWindow_(WindowID(10), 250, #AW_BLEND | #AW_HIDE)
        AnimateWindow_(WindowID(20), 250, #AW_BLEND | #AW_HIDE)
        WEvent = #PB_Event_CloseWindow
      Case 21
        AnimateWindow_(WindowID(20), 250, #AW_BLEND | #AW_HIDE)
        AnimateWindow_(WindowID(10), 250, #AW_BLEND | #AW_HIDE)
        WEvent = #PB_Event_CloseWindow
    EndSelect
  Until WEvent = #PB_Event_CloseWindow
  KillThread(TH)
  AnimateWindow_(WindowID(0), 1000, #AW_BLEND | #AW_HIDE)
Dernière modification par brossden le mar. 11/sept./2007 9:07, modifié 1 fois.
Denis

Bonne Jounée à tous
manaraselen
Messages : 5
Inscription : dim. 09/sept./2007 18:17

Message par manaraselen »

Bonjour à tous et merci d'avoir été si prompt dans vos réponses.

Je suis désolé de ne pas avoir répondu aussi rapidement que vous.

J'ai testé vite fait vos codes, mais il doit me manquer une librairie ou alors c'est du fait que je n'ai que la version d'évaluation.

->> Stefou ->> GetDC_() is not a function (or not available in demo version), macro, array or linked list
->> Brossden ->> AnimateWindows_() is not a function (or not available in demo version), macro, array or linked list

Voici ci-dessous un peu plus de précisions

Les deux fenêtres ouvertes, sont deux sessions du jeux de courses trackmania. Elles sont ouvertes avant même de lancer cet utilitaire.

Ces deux fenêtres ont toutes les deux le meme nom (il faudrait pouvoir récuperer leur ID)

le but de cet utilitaire est de repérer le compte à rebours du depart de la courses afin d'activer la première des deux fenêtres qui est prête à prendre le départ.

le compte à rebours est toujours de couleur blanche et celle ci, n'est jamais utilisée durant le reste du temps de la course.

Etant un gros débutant en PureBasic, voici tout de même ce que j'ai pu comprendre de vos codes.

------------------------------------------------
@stefou

Ton idée de faire une copie d'ecran et de l'analyser ensuite me parait une bonne piste, mais j'ai peur que ce prenne plus de temps qu'un reperage direct.

De plus encore faudrait-il que les deux fenetres ouvertes soient toujours ouvertes au même endroit.

A mon avis, et je ne sais pas faire, il doit etre possible au demarrage de l'utilitaire de deplacer la fenetre 1 à l'emplacement x,y et la fenetre deux à x2,y2.

------------------------------------------------
@brossden

tu ouvres deux fenetres, mais comme je dis plus haut les fenêtres sont déja ouvertes


------------------------------------------------
Le but de l'utilitaire est de repérer le plus vite possible (un test par seconde devrait être suffisant) le passage d'un point précis à la couleur blanche sans que la fenetre soit active (focus ??), et dès que le point passe au blanc activer la fenêtre correspondante et tout ceci en boucle.

J'espère avoir été un peu plus précis et n'hésitez pas à me redemander des précisions car je sais n'avoir pas le même language technique des "PureBasiphiles" :)

Encore une fois merci de bien vouloir m'aider :)

Ludovic.
pastor
Messages : 54
Inscription : sam. 14/avr./2007 22:59

Message par pastor »

@Brossden

Super ton code, il m'intéresse bien, par contre, lorsque l'on ferme les fenêtre, le thread continue à fonctionner, comment le "killer" à la fermeture ?

J'ai bien essayé de mettre un End en fin du programme, mais ca n'aide pas.

Laurent
manaraselen
Messages : 5
Inscription : dim. 09/sept./2007 18:17

Message par manaraselen »

resalut tout le monde.

Je viens d'avoir une idée qui me permettrai de mieux me faire comprendre.

plutot que de partir tout de suite sur deux fenetres, occupons nous du cas d'une seule, ce sera plus simple.



1 reperer l'id de la fenetre portant le nom "TmNationsESWC"
2 changer son nom en "fenetre1"
3 surveiller la couleur du point x,y de "fenetre1" (qu'elle soit active ou pas) et passer au point 4 dès que ce point devient de couleur blanche
4 activer la fenetre nommée "fenetre1"
5 retour au point 3

cela me permettrai de faire un utilitaire nommé, util1 qui surveillerai la fenetre1 et un autre utulitaire nommé util2 qui surveillerait une deuxième fenetre.

Merci à vous tous.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Ce que tu demandes là a l'air "relativement" simple à faire (à part, peut-être, la détection sur une fenêtre non active), mais avec la version enregistrée de PB. En utilisant uniquement les fonctions de PB, je doute qu'on puisse arriver à faire ce que tu demandes. En utilisant l'Api, par contre, oui. Les fonctions qui utilisent l'Api se terminent par un "_", comme celle dont tu parles un peu plus haut : AnimateWindow_()
manaraselen
Messages : 5
Inscription : dim. 09/sept./2007 18:17

Message par manaraselen »

Salut chris,

Ce n'est pas un problème. Si pure basic est capable de me faire ceci, je suis prêt à acheter la version complète.

J'ai envie de m'investir dans un language de programmation et autant que ce soit PureBasic vu qu'il est dans la continuité de GWbasic et Qbasic que je maitrisait à l'époque. Ca ne me rajeuni pas tout çà :p

Bonne soirée et merci :)

Ludovic.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Alors tu peux acheter PureBasic.

Il est meilleur que le C++, plus simple que VB, plus rapide que l'assembleur, plus...

J'en fais trop, là... Non? :mrgreen:

Non, mais sans plaisanter, tu peux l'acheter. Tu seras surpris de ce que ce langage peut faire. (Suffit de voir les jeux programmés par Polux)
manaraselen
Messages : 5
Inscription : dim. 09/sept./2007 18:17

Message par manaraselen »

Si j'ai choisi purebasic, c'est aussi que je ne suis pas à ma première experience.

L'année dernière, je me suis fais un screensaver avec les pseudos de certains amis du net.

Ces noms virevoltent sur l'écran et chaque nom se transforme en un autre tout en continuant de se ballader sur l'ecran.

Pour ceux qui connaissent, j'ai pris mon idée dans le générique de thalassa (encore une fois, ca ne me rajeuni pas :p)

Tout cela à été assez vite à programmer car tout se passait dans une seule et meme fenetre, mais là je bloque sur la gestion de fenêtres qui se trouvent à lexterieur de l'application.
brossden
Messages : 821
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Pour Pastor et ceux qui rencontre le même problème

Chez moi aucun problème de thread mais j'ais qaund même modifié le code pour je l'espère tu n'ais plus ce problème !
Denis

Bonne Jounée à tous
Répondre