Programma's besturen

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

  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Welke mogelijkheden zijn er om met een eigen geprogrammeerd programma andere programma's te besturen?
Hiermee bedoel ik automatisch tekst laten invoeren in edit boxes, op knoppen klikken en andere dingen.
Volgens mij moet dat mogelijk zijn doormiddel van handles en het zenden van messages naar programma's, maar zijn hier ook nog andere methoden voor?

Ik zou het daarnaast zeer op prijs stellen als iemand me een pagina o.i.d. kan geven waarop uitgelegd wordt hoe ik andere programma's kan besturen, als het kan misschien met een stuk voorbeeldcode. Mijn voorkeur gaat sterk uit naar C++ Builder.
Alvast bedankt.

B-Man

  • Hu9o
  • Registratie: Mei 2001
  • Laatst online: 08:34

Hu9o

Schokkend

volgens mij moet je dan eens zoeken naar rmi en ole

>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

En volgens mij kan het uberhaupt geen kwaad om eventjes aan te geven wat je zoal zelf gevonden hebt, en waarom dat niet voldoet, etc. GoT is geen afhaalbalie.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Ik heb een tijd geleden winamp kunnen besturen met een stuk voorbeeld code dat op de winamp site stond. Een deel van deze code is dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
char this_title[2048],*p;
GetWindowText(hwndWinamp,this_title,sizeof(this_title));
p = this_title+strlen(this_title)-8;
while (p >= this_title)
{

if (!strnicmp(p,"- Winamp",8)) break;
p--;

}
if (p >= this_title) p--;
while (p >= this_title && *p == ' ') p--;

*++p=0;

en

COPYDATASTRUCT cds;
cds.dwData = id;
cds.lpData = (void*)data;
cds.cbData = data_length;
SendMessage(hwndWinamp,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds);
(link: http://www.winamp.com/nsdn/winamp2x/dev/sdk/api.jhtml )
Vandaar dat ik het idee heb dat elk willekeurig programma op deze manier te besturen moet zijn, maar ik weet niet precies op welke manier en hoe ik dit alles kan gebruiken. Ik heb een programmatje proberen te schrijven dat andere ook de titel van andere programma's kan krijgen, maar dat wil slechts bij een zeer beperkt aantal programma's. Vandaar dat ik nu op zoek ben naar een wat uitgebreidere handleiding. Het probleem dat ik momenteel heb is dat ik niet precies weet waar ik op moet zoeken, en dat ik mijn zoek-query dus niet zo kan formuleren dat ik niet oneindig veel pagina's met troep krijg. Tevens loop ik op die manier kans dat ik het op een veelste moeilijke manier ga oplossen. Vandaar dat iemand me misschien een kan vertellen welke mogelijkheden er zijn en een voorbeeld heeft van deze mogelijkheid.

B-Man

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 23-08 15:12

alienfruit

the alien you never expected

Vaak kun je gebruik maken van een COM-object dat wordt aangeleverd door te gebruiker; zodoende kun je het ook besturen via WSH. Je zou eens moeten kijken of het programma die jij wilt aansturen dat ook kan. Anders moet je echt het toch echt via WM_COPYDATA en/of SendMessage() e.d. doen.

[ Voor 5% gewijzigd door alienfruit op 12-03-2003 17:57 ]


Verwijderd

Inderdaad, je kunt in principe iedere externe applicatie 'aansturen'. Echter, je bent wel beperkt tot het aansturen via de SendMessage commando's. Het Windows OS is in feite 'event driven'. Het enige wat het doet is de hele tijd de message queue pollen en de eerste message in de rij afhandelen.
Als je dus op een toets drukt bijv. komt er een WM_KEYDOWN event binnen in de Windows message queue, in die message zit o.a. de code van de toets verpakt. Bij het afhandelen van deze message wordt deze message doorgestuurd naar de actieve applicatie en triggered daar evt. een methode.
Wat je dus kunt doen is dit versturen van messages door het Windows OS nabootsen. Dat gebeurd ook in het stukje C++ code hierboven, op de laatste regel wordt de SendMessage gedaan. Wat er in het stukje code nog wel ontbreekt is hoe je aan de window handle van winamp komt. De hwndWinamp is nog niet geset namelijk. Maar dat kan weer heel eenvoudig met de win32 call:

HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName);

De class name kun je leeglaten en de windowname is gewoonlijk de title van het window dat je wil hebben, in jou geval dus "winamp" ofzo.

Als je de window handle eenmaal hebt kun je er rustig op los SendMessagen. Echter, je moet natuurlijk wel weten welke messages je kunt versturen :)
Tja, en daar zul je toch echt de MSN op moeten naslaan. Daar staan haarfijn alle win32 messages opgesomt. Overigens kun je met Spy++ die met Visual Studio Tools meekomt precies tracen welke messages er naar een bepaald window verstuurd wordt. Daarvan kun je dus het een en ander 'afkijken'.

Ik heb zelf onlangs een dergelijk programmatje gemaakt om automatisch een password dialoog te laten vullen en op de Ok button te laten drukken, zie mijn post op http://forum.java.sun.com...64018&tstart=15&trange=15

Natuurlijk kan het ook via COM, maar dan moet de applicatie wel een COM interface hebben, en dan ook nog methodes implementeren die je nodig hebt. En die kans is vermoedelijk klein...

Veel succes! ;)

  • JohanDM
  • Registratie: Augustus 2002
  • Laatst online: 16-07-2021

JohanDM

Optimist

Programma's kunnen -maar moeten niet- de mogelijkheid bieden om zich te laten aansturen.
Ze kunnen dit op meerdere manieren doen:
• Copy Data (met SendMessage een WM_COPYDATA bericht sturen)
• DDE - Dynamic Data Exchange
• OLE / COM / ActiveX (drie namen voor ongeveer hetzelfde)

Programma's die geen voorzieningen bieden/documenteren en die je toch wil aansturen, moet je eerst met een appart progje analyseren op de aanwezige windowelementen (kan je ook zelf schrijven met EnumWindows en EnumChildWindows), zodat je weet hoe je de handles van het juiste windowelement kan te pakken krijgen en daar dan de nodige berichten naar sturen met SendMessage.

In ieder geval zul je voor ieder programma dat je wil aansturen, op welke mannier dan ook, apparte code moeten schrijven, omdat ieder programma anders werkt.

"Two things are infinite: the universe and stupidity. And the former I'm not so sure about." -- Albert Einstein


  • niels_999348
  • Registratie: Maart 2003
  • Laatst online: 07:22
met hulp van visual basic is heel veel mogelijk :)
dit wordt bijvoorbeeld bij bijna alle msn - programmas gebruikt mischien iets voor jou??

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

niels_999:
met hulp van visual basic is heel veel mogelijk :)
dit wordt bijvoorbeeld bij bijna alle msn - programmas gebruikt mischien iets voor jou??
Met behulp van allerlei dingen is heel veel mogelijk 8)7 Zou je dergelijke posts willen onderbouwen met wat voorbeelden/uitleg, voortaan? ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Hartstikke bedankt voor jullie reacties. Ik kom hier zeker verder mee!

Ik zal eens verder zoeken hoe programma's te besturen zijn met DDE en OLE / COM / ActiveX, misschien dat ik hier wat mee kan.

Maar waarschijnlijk zal ik de bovenstaande manieren gaan gebruiken voor het aansturen van mijn programma's, volgens mij kan ik daar alles mee wat ik wil gaan doen (en zelfs waarschijnlijk wel meer ;))

Dat voorbeeld programmatje van jou, Ghnuffin, ziet er erg handig uit, volgens mij kan ik deze wel gebruiken voor mijn eigen programma, hier wordt volgens mij goed de basis van het versturen en dergelijke in uitgelegd, bedankt! (Oja, ik zal eens kijken naar die SpyTool, klinkt handig!)
Pagina: 1