[C++] SendInput naar ander window

Pagina: 1
Acties:
  • 241 views sinds 30-01-2008
  • Reageer

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 20:51

Klippy

Still Game

Topicstarter
Hoi,

Ik moet in Visual C++ een muisklik simuleren, werkt nu, maar toch niet helemaal.

Ik heb dus een Dialog met daarin een Propertysheet met Propertypages.
En ik heb een functie gemaakt die SendInput aanroept. Die functie staat gedeclareerd in het hoofdvenster.

Nu had ik een testprogramma gemaakt met 1 dialog en een button, werkte perfect.

Maar nu wil ik dus een button aanklikken op een propertypage, maar daar gebeurd niks.
Nou dacht ik zelf dat het verkeerde venster die klik kreeg ofzo, maar als ik een button zet op het hoofdvenster werkt 't ook niet.

Ik heb al geprobeerd om die PropertyPage en de sheet het active window te maken, maar dat helpt ook niet. En volgens mij zijn ze dat ook al.

Ook al geprobeerd om ipv SendInput een SendMessage te doen naar die Propertypage, werkt ook niet...

Dus hoe krijg ik een Input naar de goede knop?

Dit is de functie voor als jullie daar wat verkeerds in zien :)
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void CV1Dlg::ClickMouse()           
{ 
    
    MOUSEINPUT  MInput;         
    INPUT   Input;
    CPoint  MuisPos;
 
    //Haal huidige muispositie op
    GetCursorPos(&MuisPos);


    //Vul MOUSEINPUT struct
    MInput.dx = MuisPos.x;
    MInput.dy = MuisPos.y;
    MInput.dwFlags = MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN;
    MInput.time = NULL;

    //Vul INPUT struct
    Input.type = INPUT_MOUSE;
    Input.mi = MInput;

    //Stuur button down event
    SendInput(1, &Input, sizeof(Input)); 


    MInput.dwFlags = MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP;
    Input.mi = MInput;

    //Stuur button up event
    SendInput(1, &Input, sizeof(Input));


}

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Platform SDK:
If MOUSEEVENTF_ABSOLUTE value is specified, dx and dy contain normalized absolute coordinates between 0 and 65,535. The event procedure maps these coordinates onto the display surface. Coordinate (0,0) maps onto the upper-left corner of the display surface; coordinate (65535,65535) maps onto the lower-right corner. In a multimonitor system, the coordinates map to the primary monitor.
Je moet er dus zoiets van maken:
C++:
1
2
3
4
int iScreenWidth = GetSystemMetrics(SM_CXSCREEN);
int iScreenHeight = GetSystemMetrics(SM_CYSCREEN);
MInput.dx = MuisPos.x * 65535 / iScreenWidth;
MInput.dy = MuisPos.y * 65535 / iScreenHeight;

www.madwizard.org


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 20:51

Klippy

Still Game

Topicstarter
Hmmm dat had ik ook al gezien, was ik ook aan het denken. Had zelfs geprobeerd met ClientToScreen en ScreenToClient, denk alles testen, maar helaas.

Bij een testprogje met maar 1 dialog werkt de functie wel gewoon. Hij klik iig op de goede plek.

Maar nu dus niet meer. Daarom dacht ik dus dat ik in de onderliggende dialog zat te klikken ofzo.

Nog iemand een idee? :)

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

LiquidSilver schreef op 14 oktober 2002 @ 13:08:
Hmmm dat had ik ook al gezien, was ik ook aan het denken. Had zelfs geprobeerd met ClientToScreen en ScreenToClient, denk alles testen, maar helaas.
Dit is onzin, je moet die normalized coordinates gebruiken en dan werkt het gewoon (uit ervaring).

Professionele website nodig?


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 20:51

Klippy

Still Game

Topicstarter
curry684 schreef op 14 oktober 2002 @ 13:25:
[...]

Dit is onzin, je moet die normalized coordinates gebruiken en dan werkt het gewoon (uit ervaring).
Ja 't werkt ook in die andere app :P

Maar dan zonder die coördinaten.

Zal morgen ofzo nog wel eens proberen, ben ff met wat anders bezig nu :)

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Bij mij hebben de coordinaten in die structure geen invloed op de positie van de muisklik, de huidige cursorpos wel. Je moet ze evengoed natuurlijk op de juiste waardes zetten voor de zekerheid & compatibility.
Waarom wil je trouwens automatisch op die button klikken? Misschien is er een alternatieve methode?

www.madwizard.org


Verwijderd

Misschien gewoon een PostMessage op de HWND van die button? Al het je eigen applicatie is, dan gewoon de event versturen die die button genereert natuurlijk ;)

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 20:51

Klippy

Still Game

Topicstarter
Verwijderd schreef op 15 oktober 2002 @ 14:45:
Misschien gewoon een PostMessage op de HWND van die button? Al het je eigen applicatie is, dan gewoon de event versturen die die button genereert natuurlijk ;)
Is binnen en buiten mijn eigen applicatie, dus moet wel zo.

Maar ik snap er niks van, vandaag nog eens gekeken...
In testapplicatie werkt het perfect.

Heb ook al geprobeerd die functie te declareren in de propertysheet en aan te roepen uit main, maar werkt niet :(

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Doe eens een sleep van 1000ms tussen de press en release v/d button, dan zie je als het goed gaat de button ingedrukt worden.

Professionele website nodig?


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 20:51

Klippy

Still Game

Topicstarter
curry684 schreef op 16 oktober 2002 @ 18:01:
Doe eens een sleep van 1000ms tussen de press en release v/d button, dan zie je als het goed gaat de button ingedrukt worden.
Ja dat werkt ook weer alleen in dat andere programma met maar 1 form.

Had ik al geprobeerd.
Maar in dat gewone programma dus niet.

Heb geen idee hoe het komt. Als ik nou die op die knop een SetCaption() doe werkt het wel, maar dat is vrij logisch. Maar dan weet ik dus wel dat er iig een button down en een up binnenkomen.
Dus dan kan de plaats fout zijn, maar de cursor staat boven die knop en ik zag hier dat voor de rest dan die coördinaten niks uitmaken. Ook zonder die dx en dy doet 't niks.

Dus daarom heb ik nog steeds het idee dat 't op het verkeerde form aankomt ofzo :?

Maar ik zal morgen eens proberen in die testapplicatie om een PropertySheet met 2 pages ofzo neer te zetten en dan daar een knop op. Kijken of dat werkt. Heb nu alleen met 'n losse knop getest eigenlijk, maarja zou toch toch moeten werken... ?

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

En een paar FindWindow's om de button te vinden met een BN_CLICKED notification naar z'n parent is geen optie? Akhorahil zei zoiets al maar waarom zou dat een probleem zijn?

www.madwizard.org


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Geef in die flags ook eens MOUSEEVENTF_MOVE mee, dan weet het systeem tenminste dat je de muis boven die button hebt geparkeerd...

Professionele website nodig?


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 20:51

Klippy

Still Game

Topicstarter
madwizard schreef op 16 oktober 2002 @ 20:55:
En een paar FindWindow's om de button te vinden met een BN_CLICKED notification naar z'n parent is geen optie? Akhorahil zei zoiets al maar waarom zou dat een probleem zijn?
Nou dan kan wel, maar het is een User Interface voor een bestaand programma. Van dat programma mag ik geen source wijzigen.
Dat bestaande programma zet een plaatje in mijn User Interface.
Nou moet ik met die fnctie in mijn UI kunnen klikken, maar ook op dat plaatje.

Op dat plaatje klikken zal alleen gaan met SendInput().
Dus ik denk maak 1 functie voor alles.

Maar als het niet werkt, moet ik maar 2 functies gaan maken. 1tje die gewoon een notifiction oid stuurt ja binnen de UI en 1tje die echt klikt op het plaatje.

Maar ik heb liever dat dit werkt :)
curry684 schreef op 17 oktober 2002 @ 02:48:
Geef in die flags ook eens MOUSEEVENTF_MOVE mee, dan weet het systeem tenminste dat je de muis boven die button hebt geparkeerd...
Zelfde: Doet niks ;(

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

LiquidSilver schreef op 17 oktober 2002 @ 11:33:
Nou dan kan wel, maar het is een User Interface voor een bestaand programma. Van dat programma mag ik geen source wijzigen.
Dat is ook niet nodig, je hoeft alleen wat messages ernaar toe te sturen.
Dat bestaande programma zet een plaatje in mijn User Interface.
Nou moet ik met die fnctie in mijn UI kunnen klikken, maar ook op dat plaatje.
Op dat plaatje klikken zal alleen gaan met SendInput().
Dus ik denk maak 1 functie voor alles.
Je kunt ook nog proberen handmatig WM_LBUTTONDOWN/UP messages te sturen naar het window waar het plaatje in zit.

www.madwizard.org


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 20:51

Klippy

Still Game

Topicstarter
madwizard schreef op 17 oktober 2002 @ 11:54:
[...]
Dat is ook niet nodig, je hoeft alleen wat messages ernaar toe te sturen.

[...]
Je kunt ook nog proberen handmatig WM_LBUTTONDOWN/UP messages te sturen naar het window waar het plaatje in zit.
Hmm 't is eigenlijk een venster gemaakt door een ander programma kan ik daar bij komen? :)

Heb nog niet geprobeerd eigenlijk.
Maar ik ga dat zometeen maar maken denk ik. Dan zal ik morgen ofzo nog eens testen of dat kan.

Hier kom ik toch ff niet uit, dus dan maar andere manier zoeken idd.

Toch bedankt :)
Als 't morgen niet lukt op 'n andere manier schop ik wel weer ;)

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Hint: eerst WindowFromPoint en daarna ChildWindowFromPoint.

Professionele website nodig?


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 20:51

Klippy

Still Game

Topicstarter
Morgen :)

ff schopje, want heb er nog eens naar gekeken. Ofja ik had de clickfunctie weer nodig en het werkte gewoon....

Oke mooi, maar nu heb ik dus een vraag. Reden waarom het niet werkte is me dus niet duidelijk en weet ook niet zo snel hoe ik het moet oplossen.

Ik laat dus een dialog zien waarin je kan kiezen wat je wil doen, daarna wordt dat gedemonstreerd en dus ook een muisklik gesimuleerd.

Voorbeeldje:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    Return = Ddlg.DoModal();

    while (Return != -1 )   
    {   
        switch ( Return )
        {  
            case 0:
               Bla();
               ClickMouse();
               Return = Ddlg.DoModal();
            break;
            case 1:
               Bla();
            break;
        } 
    }


En dan bij case 0. Daar wordt functie Bla() uitgevoerd, vervolgens komt de andere dialog weer naar voren.
Die clickmouse wordt dus of niet uigevoerd of niet goed?
Is overigens zelfde functie nog.

Het vreemde is dat als ik doe:
C++:
1
2
3
4
5
            case 0:
               Bla();
               ClickMouse();
               Return = -1;
            break;

Dan springt hij dus uit de while en werkt ook de muisklik gewoon :?

Als iemand me kan uitleggen hoe dat kan....
Want ik ga er toch gewoon van uit dat die Return = Ddlg.DoModal(); toch pas wordt uitgevoerd nadat hij returnt uit de ClickMouse() functie?

Of zie ik ergens wat over het hoofd?

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

LiquidSilver schreef op 25 november 2002 @ 10:38:
Of zie ik ergens wat over het hoofd?
Message queues.

Professionele website nodig?


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 20:51

Klippy

Still Game

Topicstarter
Ja daar zat ik al aan te denken...

Maar worden die niet gewoon afgehandeld ondanks wat ik doe?
Als ik 2 messages in de queue gooi dan kan ik verder toch doen wat ik wil en worden die dingen gewoon afgehandeld?

Hoewel... Heb nu alweer een probleempje wat daar misschien door komt.

* Klippy gaat nog ff snel 1e hoofstuk MFC boek doorbladeren :)

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

LiquidSilver schreef op 25 November 2002 @ 10:59:
Ja daar zat ik al aan te denken...

Maar worden die niet gewoon afgehandeld ondanks wat ik doe?
Als ik 2 messages in de queue gooi dan kan ik verder toch doen wat ik wil en worden die dingen gewoon afgehandeld?
Tis niet multithreaded of zo, als jij niet specifiek de message queue leegt gaat ie niet leeg.

Professionele website nodig?


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 20:51

Klippy

Still Game

Topicstarter
curry684 schreef op 25 November 2002 @ 11:01:
[...]

Tis niet multithreaded of zo, als jij niet specifiek de message queue leegt gaat ie niet leeg.
Dus die queue wordt alleen leeggehaald als ik idle ben zeg maar :?

Hmm, dat is uuhm.. klote :P

Ga ik eens bedenken wat ik nu moet doen ;)

Als ik nou in een functie dan zoiets wil doen... Kan ik dan niet de functie ff pauzeren ofzo? Zodat hij queue kan leeghalen en dan verder met m'n functie :?
Zal wel domme vraag zijn :P

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Ik heb hier een functie gepost die tussentijds de message queue leegverwerkt.

Professionele website nodig?


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 20:51

Klippy

Still Game

Topicstarter
curry684 schreef op 25 November 2002 @ 11:07:
Ik heb hier een functie gepost die tussentijds de message queue leegverwerkt.
Ey thx :)

Maarre
DispatchMessage
The DispatchMessage function dispatches a message to a window procedure. It is typically used to dispatch a message retrieved by the GetMessage function.
Dus die wordt dan dus wel meteen afgehandeld? Normaal wordt queue afgehandeld zodra mijn functie stopt, maar nu wordt hij afgehandeld tijdens mijn functie?
Dus mijn functie wordt geblokkeerd totdat queue leeg is.

Dat zou schelen idd, wordt me alles duidelijk :)
Ik ga eens testen!
En bedankt weer _/-\o_

edit:

Oeh, gaat perfect en ander probleem wat ik had ook :)
Thx :*)

[ Voor 6% gewijzigd door Klippy op 25-11-2002 11:19 ]

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Lees eens dringend je boek na over message queues want volgens mij snap je geen hout van de achterliggende principes :)

[ Voor 15% gewijzigd door curry684 op 25-11-2002 11:19 . Reden: Rephrase! ]

Professionele website nodig?


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 20:51

Klippy

Still Game

Topicstarter
curry684 schreef op 25 November 2002 @ 11:18:
Lees eens dringend je boek na over message queues want volgens mij snap je er geen hout van :)
:P

Ja ik zei het ook verkeerd :)

Maar ik snapte er niet heel veel van idd ;)
Ga nu ff lezen ja, goed idee idd :+

edit:

Uuhm ja ik snapte het toch goed geloof ik, maar ik zei het idd niet goed net :)

Maarja ik lees toch nog maar ff verder, 2e keer is het opeens stuk duidelijker :P

Zie nu ook idd staan wat je zei van die messages, zelfde functie staat letterkijk in Hoofdstuk 1... Toch beter lezen volgende keer.

[ Voor 35% gewijzigd door Klippy op 25-11-2002 11:39 ]

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO

Pagina: 1