[c++/Win32/API]Plakken in elk veld, bij cursor.

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

  • neevedr
  • Registratie: November 2002
  • Laatst online: 19:50

neevedr

Dat was ik niet!

Topicstarter
Hoe kan ik in elk veld, in elk programma tekst plakken vanuit mijn applicatie. Hoe kan ik de CTRL-V toets combi vervangen. Met de WM_PASTE kan ik al wel plakken in bijvoorbeeld Notepad of adressenbalk, de standaart windows textveldjes (EDIT-control velden?). Ik wil ook kunnen plakken in een webpagina/form veld e.d. Dus op elke positie waar de cursos (caret) staat te knipperen.


Heb al wel gevonden hoe het in delphi kan maar kan dat niet vertalen naar C++ http://gathering.tweakers.net/forum/list_messages/788175///

Hopelijk is mijn vraag duidelijk genoeg.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Uhm, volgens mij gewoon een sendmessage (idd met WM_Paste) een message sturen naar de juiste hWnd :? Wat snap je dan niet? Wat lukt niet?
Je zou overigens ook gewoon (ranzig :X ) een sendkeys kunnen doen :X

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • neevedr
  • Registratie: November 2002
  • Laatst online: 19:50

neevedr

Dat was ik niet!

Topicstarter
WM_PASTE werkt volgens mij alleen op een C++ Textveld en niet op andere velden in andere talen in andere programmas. Het is de bedoeling dat ik in elk programma, op elke plek waar de cursor staat kan plakken.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
neevedr schreef op dinsdag 08 februari 2005 @ 14:30:
WM_PASTE werkt volgens mij alleen op een C++ Textveld en niet op andere velden in andere talen in andere programmas. Het is de bedoeling dat ik in elk programma, op elke plek waar de cursor staat kan plakken.
Waar haal je dat vandaan? Dat is complete BS.
WM_Paste is gewoon een Window Message (vandaar de WM_ ) en in principe ondersteunt ieder window object zo'n message. In het geval van een WM_Paste natuurlijk dus alleen een textbox of combobox, maar andere WM_ messages zijn van toepassing op zo'n beetje alle objecten). Daar heb je namelijk een OS voor (en een API). Of dat nou in C++ wordt gebruikt, of vanuit Delphi, Visual Basic of voor mijn part ASM maakt geen fluit uit.

Je schopt tegen Windows aan, je zegt "Hey, ik heb hier een hWnd voor je, stuur die eens effe een paste-message voor me met de volgende data..." En hoe kom je aan de hWnd? Juist. Die vraag je ook weer aan Windows d.m.v. de API.

Verdiep je eens in MSDN... WM_Paste. Dat de voorbeelden die daar gegeven worden (voornamelijk?) in C++ worden gegeven is puur omdat de meeste programmeurs dat wel kunnen lezen en omdat het aardig ingeburgerd/gestandaardiseerd is. Dat je het niet kunt "vertalen" naar Delphi (of, for that matter, een andere taal) ligt meer aan jezelf dan aan de API. Je wou C++, dus wat wil je nog meer? Ik dacht effe dat je C++ had gevonden en Delphi wilde

[ Voor 36% gewijzigd door RobIII op 08-02-2005 15:19 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 08:58
Waarom zou SendKeys ranzig zijn? Als je toch alleen puur tekst wilt plakken wat je ook nog is zelf ingelezen hebt lijkt het me een prima oplossing :P

[KNIP]

edit:

Sorry, ik dacht dat het om de muispointer ging, maar het gaat gewoon om de caret...

[ Voor 79% gewijzigd door riezebosch op 08-02-2005 16:52 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
riezebosch schreef op dinsdag 08 februari 2005 @ 14:57:
Waarom zou SendKeys ranzig zijn?<knip> Moet je alleen wel zorgen dat het item onder de cursor de focus krijgt.
Een sendkeys is natuurlijk niet veel meer dan een wrapper van een bult WM_ messages, en dan kun je natuurlijk gewoon beter meteen WM_Paste gebruiken, die daarvoor bedoeld is. Dan zit je niet te klooien met een focus zoeken e.d. Wat als het window niet meer actief is (omdat de gebruiker aan het werk is, switcht tussen vensters, weet ik het wat). Dat is natuurlijk vragen om moeilijkheden.

[ Voor 56% gewijzigd door RobIII op 08-02-2005 15:01 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 08:58
Ik ging nog is teruglezen en het gaat inderdaad niet om het item onder de cursor maar het object met de caret. Dan kan je volgens mij zondermeer de SendKeys gebruiken, omdat de TS toch alleen maar plain-text wil. Waarom zou je het dan via het clipboard laten verlopen...

Maakt in principe natuurlijk ook niks uit. De TS heeft er zelf toch al voor gezorgd dat z'n data in plain text staat, en kan dus ook best een WM_PASTE gebruiken. Dan rest hem alleen nog de GetFocus aan te roepen. Daarvoor moet ie zichzelf even aan de message queue van de window met de keyboard focus knopen met AttachTreadInput, omdat je anders NULL terugkrijgt (aldus MSDN).

Edit: Ik loop geloof ik echt te slapen. Een WM_PASTE naar de HWND van de ForegroundWindow sturen zal wel voldoende zijn :z

[ Voor 52% gewijzigd door riezebosch op 08-02-2005 17:12 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • neevedr
  • Registratie: November 2002
  • Laatst online: 19:50

neevedr

Dat was ik niet!

Topicstarter
Samengevat:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
    DWORD dwPoint = GetMessagePos();
        p.x = LOWORD(dwPoint);  
        p.y = HIWORD(dwPoint);

    hWndGet = WindowFromPoint(p);
    DWORD idAttach   = GetWindowThreadProcessId(hWndGet,NULL);
    DWORD idAttachTo = GetCurrentThreadId();
    // Waarom?  
    AttachThreadInput(idAttach, idAttachTo, TRUE); 

    SetFocus(hWndGet);
    //hWndGet = GetForegroundWindow();
    SendMessage(hWndGet,WM_PASTE,0,0);

Kort samengevat: na een muisklik op een bepaalt veld wordt de focus gezet op dat veld en wordt de WM_PASTE message verstuurt. In bv. Notepad, of de adressenbalk van IE komt dan netjes te te plakken tekst te staan maar in bv. Visual Studio tekstveld, in dit veld, in een veld in een formulier op een webpagina of in de adressenbalk van Firefox weer niet.
Hoe komt het dat het de ene keer wel wil maar bij een ander venster weer niet? :?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:15

.oisyn

Moderator Devschuur®

Demotivational Speaker

Omdat een WM_PASTE alleen ontworpen is voor standaard edit- en combocontrols, dat staat ook gewoon in de documentatie van WM_PASTE

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 08:58
Ik heb ook m'n post aangepast, want ik dacht dat het je om het control onder de muispointer ging. Maar het ging je blijkbaar om het control dat de focus al heeft. Je kan het gedeelte met WindowFromPos, WindowFromPoint, AttachThreadInput en SetFocus eruit halen. De WM_PASTE werkt dus, zoals .oisyn aangeeft, alleen maar op standaardcontrols. Wat dan rest is denk ik een SendInput uit te voeren. Dit stuurt al gewoon de meegegeven tekst naar het control dat de focus heeft, en hoe je dus verder geen zorgen om te maken.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:15

.oisyn

Moderator Devschuur®

Demotivational Speaker

riezebosch schreef op dinsdag 08 februari 2005 @ 21:15:
Wat dan rest is denk ik een SendInput uit te voeren.
Wie garandeert dat ctrl-v de juiste toetscombinatie is om iets te plakken, en niet om bijv. een harde schijf te formatteren?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 08:58
Hoe bedoel je?

Hmmmm. Ik heb geloof ik een en ander heel verkeerd gelezen (kan zijn dat ik 2 topics door elkaar gehaald heb ofzo). Haha, ik zie nu dat ik de link die de TS in z'n openingspost geef heb geprobeerd te beantwoorden.

Om de CTRL+V af te vangen zul je denk ik heel wat meer truuks moeten doen, aangezien dit door Windows al geregistreerd is. Ook als het programma, zoals .oisyn dus aangeeft, zelf een implementatie heeft voor CTRL+V zul je deze af moeten vangen voordat het programma dat doet (met bijvoorbeeld een low-level keyboardhook). Lijkt me allemaal enigzins overkill voor wat je wilt bereiken :X

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Ctrl-V is geen WM_PASTE op DVORAK toetsenbord. Daar zit de V nou eenmaal op de plaats van de W in QWERTY (d'oh) en dat is onhandig ver van de Ctrl

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 08:58
Wat een toeval, ik ben net bezig Dvorak te leren :)

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Verwijderd

MSalters schreef op dinsdag 08 februari 2005 @ 23:31:
Ctrl-V is geen WM_PASTE op DVORAK toetsenbord. Daar zit de V nou eenmaal op de plaats van de W in QWERTY (d'oh) en dat is onhandig ver van de Ctrl
Een van de dingen waar ik me het meeste aan ergerde toen ik probeerde Dvorak te leren is dat de hotkeys opeens allemaal op een andere plek zitten.

Maar "Ctrl-V" zou toch "Ctrl-V" moeten zijn, of de toetsenbord layout nou veranderd is of niet?

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 08:58
Weer terug on topic. Is het niet mogelijk gewoon jouw data op het clipboard te plaatsen, zodat Windows verder voor je afhandeld als de gebruiker CTRL+V (of wat de shortcut bij de toetsenbordindeling ook mag zijn) voor je afhandeld?

MSDN: OpenClipboard, EmptyClipboard, SetClipboardData en CloseClipboard.

[ Voor 8% gewijzigd door riezebosch op 09-02-2005 02:56 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
riezebosch schreef op woensdag 09 februari 2005 @ 02:54:
Weer terug on topic. Is het niet mogelijk gewoon jouw data op het clipboard te plaatsen, zodat Windows verder voor je afhandeld als de gebruiker CTRL+V (of wat de shortcut bij de toetsenbordindeling ook mag zijn) voor je afhandeld?

MSDN: OpenClipboard, EmptyClipboard, SetClipboardData en CloseClipboard.
...En dan kom je dus weer terug bij "af": WM_Paste, maar die werkt alleen voor textboxes en dropdowns volgens MSDN.
Het is me overigens ook erg onduidelijk wat de TS nou eigenlijk wil. Misschien kan hij wat meer uitwijden en ons wat meer inzicht geven in wat hij probeert te doen? Wellicht zijn er betere/andere manieren voor...

[ Voor 19% gewijzigd door RobIII op 09-02-2005 03:38 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 08:58
Dan hoef je zelf toch niets te doen met WM_PASTE, als je je data gewoon op het Clipboard zet? Volgens mij hoef je alleen maar de WM_PASTE alleen maar te implementeren als je de content van het Clipboard wilt kopieren naar het control waar je de message heenstuurt. Maar ik neem aan dat bij CTRL+V Windows dit standaard al afhandelt. Lijkt me stug dat je zelf nog voor het plakken in alle andere programma's moet zorgen ;)

Ik weet niet wat de TS op het Clipboard wil zetten, maar als dat iets is uit een standaard Windows control kan ie ook de WM_COPY daarheen sturen.

MSDN: Cut and Copy Operations

[ Voor 16% gewijzigd door riezebosch op 09-02-2005 09:53 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:15

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het idee is dat ie zelf een paste actie wil forceren.
Verwijderd schreef op woensdag 09 februari 2005 @ 02:25:
Maar "Ctrl-V" zou toch "Ctrl-V" moeten zijn, of de toetsenbord layout nou veranderd is of niet?
Een applicatie mag natuurlijk helemaal zelf kiezen wat ie onder de sneltoets ctrl-v hangt, daarnaast kan ik me voorstellen dat je de standaard hotkeys van windows ook gewoon kunt wijzigen (ongeacht je keyboard layout), dus nogmaals: welke garantie heb je dat ctrl-v ook doet wat je denk dat het doet? Heb je niet.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 08:58
neevedr schreef op dinsdag 08 februari 2005 @ 01:08:
Hoe kan ik in elk veld, in elk programma tekst plakken vanuit mijn applicatie. Hoe kan ik de CTRL-V toets combi vervangen. Met de WM_PASTE kan ik al wel plakken in bijvoorbeeld Notepad of adressenbalk, de standaart windows textveldjes (EDIT-control velden?). Ik wil ook kunnen plakken in een webpagina/form veld e.d. Dus op elke positie waar de cursos (caret) staat te knipperen.


Heb al wel gevonden hoe het in delphi kan maar kan dat niet vertalen naar C++ http://gathering.tweakers.net/forum/list_messages/788175///

Hopelijk is mijn vraag duidelijk genoeg.
Dat zelf een paste forceren lees je dus in het topic waar de TS naar verwijst, maar niet in zijn vraag zelf. Als ik het nu tenminste wél goed interpreteer... Ok, er staat dat hi jde CTRL+V toets combi wilt vervangen, maar uit de rest van het verhaal maak ik op dat het gewoon om een standaard CTRL+V actie gaat. Vandaar mijn verwijzing om gewoon zelf je data op het Clipboard te plaatsen.

[ Voor 12% gewijzigd door riezebosch op 09-02-2005 10:15 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • neevedr
  • Registratie: November 2002
  • Laatst online: 19:50

neevedr

Dat was ik niet!

Topicstarter
RobIII schreef op woensdag 09 februari 2005 @ 03:35:
Het is me overigens ook erg onduidelijk wat de TS nou eigenlijk wil. Misschien kan hij wat meer uitwijden en ons wat meer inzicht geven in wat hij probeert te doen? Wellicht zijn er betere/andere manieren voor...
Ik heb een beetje genoeg van elke keer weer overal je hele wachtwoord in te typen. Cookies worden weleens verwijderd en wachtwoordbeheer werkt ook niet altijd zoals het hoort. Ik heb een systemtray icoon gemaakt met een menu waaruit ik een wachtwoord kan kiezen. De bedoeling is dan dat het wachtwoord dan op de webpagina in het wachtwoordveld automatisch wordt ingevuld.

Het wachtwoord wordt nu eerst op het clipboard geplaatst en kan dan geplakt worden in het wachtwoord veld. Dit plakken wil ik ook automatisch laten gaan. (Het zou trouwens mooier zijn als dit niet via het clipboard gaat).

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:15

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dan zou ik het hele clipboard achterwege laten en gewoon de toetsen doorsturen met SendInput. Dan is het voor de applicatie net of hij die invoer gewoon van de user krijgt, en zal het werken voor elk window waarin je tekst in kan voeren (behalve voor games en andere applicaties die direct gebruik maken van de hardware dmv DirectInput oid)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • neevedr
  • Registratie: November 2002
  • Laatst online: 19:50

neevedr

Dat was ik niet!

Topicstarter
offtopic:
Bescheiden vraagje, heeft iemand een simpel voor beeld van een sendinput() functie?

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 08:58
Probleem is dan dat zodra je het menu opent en het wachtwoord uitkiest de applicatie waar dat wachtwoord ingevuld moet worden de focus kwijt is. Misschien dat dit standaard de volgende in de Z-order is (na jouw applicatie / de systemtray).

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • Markieman
  • Registratie: December 2001
  • Laatst online: 12:16
riezebosch schreef op woensdag 09 februari 2005 @ 11:06:
Probleem is dan dat zodra je het menu opent en het wachtwoord uitkiest de applicatie waar dat wachtwoord ingevuld moet worden de focus kwijt is. Misschien dat dit standaard de volgende in de Z-order is (na jouw applicatie / de systemtray).
Hij zou zelf een global hotkey kunnen registreren, die wordt afgevangen door zijn app. Vraagt de actieve hWnd op. En toont dan pas zijn scherm waar het wachtwoord gekozen kan worden.

Daarna wachtwoord versturen, scherm uit en opgevraagde hWnd weer actief maken

You do not fear them? - The Wraith? Naah. Now *clowns*, that's another story.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:15

.oisyn

Moderator Devschuur®

Demotivational Speaker

neevedr schreef op woensdag 09 februari 2005 @ 11:01:
offtopic:
Bescheiden vraagje, heeft iemand een simpel voor beeld van een sendinput() functie?
Ik zat even te kijken, het wordt wellicht nog een beetje tricky om het intypen van een stuk tekst te simuleren met sendinput omdat je virtual keycodes en toetscombinaties nodig hebt, en dat is weer afhankelijk van je keyboard layout. Zo is de % op een us keyboard een shift gevolgd door de 5, maar voor een andere layout kan dat wel eens een heel ander teken zijn.

Daarnaast is het nogal dubbelop, SendInput stuurt gewoon WM_KEYDOWN en WM_KEYUP messages, TranslateMessage vertaalt die toetsinput naar characters en maakt er dus een WM_CHAR van.

Het is misschien handiger om gewoon zelf direct die WM_CHARs te sturen, dan hoef je ook niet terug te rekenen naar virtual keycodes :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1