Toon posts:

[VB6] geselecteerde tekst in elke windows appl. kopiëren

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

Verwijderd

Topicstarter
Ik zoek een manier om een geselecteerde tekst, uit eender welke windows applicatie (word document, html pagina,....) te kopiëren naar het klembord. Dus, ik selecteer een stukje tekst op een webpagina, en wanneer ik op een knop druk in een VB form wordt de geselecteerde tekst gekopieerd & verder verwerkt.

Dit lukt me wel in een tekstbox in VB zelf, op deze manier:
code:
1
2
dim x as string
x = clipboard.gettext

Maar hoe kan ik het nu vanuit een ander document doen? Ik had wat info gevonden over screen.activecontrol Maar daar werd op deze manier verwezen:
code:
1
 Clipboard.SetText Screen.ActiveControl.SelText

Hierdoor krijg ik echter de melding: run-time error 438 object doesn't support this property or method. Dus SelText achter ActiveControl gaat niet.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:23
Meeste ranzige manier : SendKeys

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
CTRL+C?

Wat je wilt gaat denk ik sowieso niet werken, want zodra je op een knop op je Form drukt, heeft jouw programma de focus en kan je dus niet meer achterhalen uit welk programma je de geselecteerde tekst wilt kopiëren.

Tenminste, als ik je vraag zo goed interpreteerd...

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


Verwijderd

Topicstarter
riezebosch schreef op donderdag 14 juli 2005 @ 10:23:
CTRL+C?

Wat je wilt gaat denk ik sowieso niet werken, want zodra je op een knop op je Form drukt, heeft jouw programma de focus en kan je dus niet meer achterhalen uit welk programma je de geselecteerde tekst wilt kopiëren.

Tenminste, als ik je vraag zo goed interpreteerd...
klopt, dat is de bedoeling. Ik heb echter ook geen idee hou ik dat zou moeten aanpakken omdat ik inderdaad de focus verlies van het scherm met de informatie op. Nu moet de gebruiker gewoon zelf ctrl+c doen, dus het werkt wel...maar mocht het lukken om dit automatisch te laten gebeuren...

Toch bedankt voor de reacties

edit: @Farlane: en een minder ranzige manier? :P

[ Voor 4% gewijzigd door Verwijderd op 14-07-2005 10:29 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:23
Verwijderd schreef op donderdag 14 juli 2005 @ 10:28:
edit: @Farlane: en een minder ranzige manier? :P
Weet ik niet. Mijn plan was om dus met SendKeys CTRL+C te sturen :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
farlane schreef op donderdag 14 juli 2005 @ 10:51:
[...]


Weet ik niet. Mijn plan was om dus met SendKeys CTRL+C te sturen :)
aha....
maar hoe weet ik dan dat die ctrl+c van toepassing is op het stukje tekst dat ik heb geselecteerd in een andere toepassing? De verwijzing naar dat deel bedoel ik (zoals txtBox.SelText)

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
Je kan een Hotkey installeren, en als de gebruiker daarop drukt de tekst van het actieve control uitlezen en daar verder mee doen wat je wilt. Je komt dan alleen echt in de Win32 API sfeer, en dus niet meer echt VB6 (hoewel het natuurlijk wel gewoon mogelijk is in VB).

Het vervelende is: om de handle van het object dat de focus heeft in een ander programma op te kunnen vragen, moet je eerst jouw thread aan die van die applicatie knopen met AttachThreadInput. Dan kan je pas een GetFocus doen om de handle te verkrijgen. Daarna kan je de tekst uitlezen (weet niet eens zo of je wel alleen de geselecteerde tekst kan opvragen). En daarna moet je jouw thread weer ontkoppelen met AttachThreadInput.

Misschien is het een idee om mbv een timer gewoon het clipboard in de gaten te houden? Bestaan geloof ik wel implementaties die dat al doen.

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


Verwijderd

Topicstarter
Daarvan ken ik jammer genoeg niet zo veel. Als ik wat tijd heb zal ik eens wat opzoekwerk doen. Voorlopig blijf ik dan nog maar bij handmatig ctrl+c.

Met een timer het klembord controleren is niet zo'n heel goede oplossing denk ik. De tool wordt immers niet zoveel gebruikt (wordt gebruikt om een telefoonnummer te selecteren op het scherm & met een druk op de knop wordt dit nummer mbv een ander programma gebeld). Het is dan redelijk wat verspilling als ik om de bv. 5sec het klembord controleer. Als ik dit doe elke 10min, dan moet de gebruiker weer te lang wachten...

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je kunt natuurlijk ook gewoon terug lopen door de window order en het vorige actieve venster ophalen. En speciaal voor farlane ;) dat kan dus door ALT-SHIFT-TAB te sturen :P
Maar daar zijn ook hele mooie window manager API's voor :P Effe wroeten, hang on...

/edit
http://msdn.microsoft.com...nctions/getalttabinfo.asp :P
http://msdn.microsoft.com...nctions/getnextwindow.asp met GW_HWNDPREV :Y)

Een heel goede bron voor voor VB6 i.c.m. API's is overigens vbnet.mvps.org. Je moet maar eens kijken op deze pagina waar geheid veel voor je tussen zit dat je kunt gebruiken in je project.
Verwijderd schreef op donderdag 14 juli 2005 @ 11:32:
Met een timer het klembord controleren is niet zo'n heel goede oplossing denk ik. De tool wordt immers niet zoveel gebruikt (wordt gebruikt om een telefoonnummer te selecteren op het scherm & met een druk op de knop wordt dit nummer mbv een ander programma gebeld). Het is dan redelijk wat verspilling als ik om de bv. 5sec het klembord controleer. Als ik dit doe elke 10min, dan moet de gebruiker weer te lang wachten...
Geloof me, ik ben jaaaaren een ontzettende bitneuker geweest, en "ooit" vond ik dat ook enorme verspilling. Nu: Als je iedere seconde je clipboard zou monitoren "kost" het geen drol (zolang je het dus geen 10.000 keer per seconde doet). Tevens kun je volgens mij, maar dat zul je even op MSDN of op vbnet.mvps.org moeten zoeken, ook een event "vangen" bij een verandering op het clipboard (een soort onchange dus).

[ Voor 105% gewijzigd door RobIII op 14-07-2005 23:58 ]

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: 04-05 13:09
RobIII schreef op donderdag 14 juli 2005 @ 23:43:
[...]

Geloof me, ik ben jaaaaren een ontzettende bitneuker geweest, en "ooit" vond ik dat ook enorme verspilling. Nu: Als je iedere seconde je clipboard zou monitoren "kost" het geen drol (zolang je het dus geen 10.000 keer per seconde doet). Tevens kun je volgens mij, maar dat zul je even op MSDN of op vbnet.mvps.org moeten zoeken, ook een event "vangen" bij een verandering op het clipboard (een soort onchange dus).
Helemaal mee eens. Ben er in m'n huidige project ook achter gekomen dat wanneer je in een zoekloopje een Thread.Sleep van 100ms plaatst je CPU gebruik ook van 100% naar 1% keldert :)

Laatste dacht ik ook, maar toen ik ff op MSDN bij Clipboard naar info ging kijken kon ik er zo niks over terugvinden. Maar dacht dat Klembord-Viewers ook op basis daarvan werken.

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 vrijdag 15 juli 2005 @ 00:02:
[...]
Helemaal mee eens. Ben er in m'n huidige project ook achter gekomen dat wanneer je in een zoekloopje een Thread.Sleep van 100ms plaatst je CPU gebruik ook van 100% naar 1% keldert :)
Early optimization is the root of much all evil :P (vrij naar Knuth)
Een thread.sleep gooit gewoon je app een "slaapstand" en daarmee dus "ruimte" makend voor andere processen. Ja, je CPU usage daalt naar een laag percentage, maar is dit niet hakken met een botte bijl? Pak liever het probleem bij de wortels aan: Waarom heb je een 100% CPU usage? (En als dat "onvermijdelijk" is, throttle dan je thread spreek dat eens uit :P naar een lagere prio ofzo).
riezebosch schreef op vrijdag 15 juli 2005 @ 00:02:
Laatste dacht ik ook, maar toen ik ff op MSDN bij Clipboard naar info ging kijken kon ik er zo niks over terugvinden. Maar dacht dat Klembord-Viewers ook op basis daarvan werken.
Het moet kunnen bij mijn weten, maar ach.. voor een simpel tooltje is het echt geen ramp als je 1 a 2 keer per seconde je clipboard checked... En anders effe hier als je het met een API callback ofzo wil doen. This should do the trick :P

[ Voor 24% gewijzigd door RobIII op 15-07-2005 00:20 ]

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


  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 19-03 00:48

ZaZ

Tweakers abonnee

ben in een goede bui :P
hier een stukje code om je clipboard te monitoren

in module:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function SetClipboardViewer Lib "user32" (ByVal hwnd As Long) As Long
Public Const WM_DRAWCLIPBOARD = &H308
Public Const GWL_WNDPROC = (-4)
Dim PrevProc As Long
Public Sub HookForm(F As Form)
    PrevProc = SetWindowLong(F.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnHookForm(F As Form)
    SetWindowLong F.hwnd, GWL_WNDPROC, PrevProc
End Sub
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
    If uMsg = WM_DRAWCLIPBOARD Then
        MsgBox "boe"
    End If
End Function


in je form
Visual Basic:
1
2
3
4
'de boel subclassen
HookForm Me 
'form registeren als clipboardviewer
SetClipboardViewer Me.hwnd

wel oppassen met debuggen, want je blaast de IDE zo op :)
zijn wel betere manieren voor inmiddels. ga maar eens op zoek naar Paul Caton zijn subclass techniek.
maar dat mag je allemaal zelf uitzoeken :p

Lekker op de bank


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
ZaZ schreef op vrijdag 15 juli 2005 @ 00:51:
ben in een goede bui :P
hier een stukje code om je clipboard te monitoren
<code>
Zo'n goede bui dat je maar even voor hem gegoogled hebt? (Origineel) Ik dacht dat ik voldoende hints had gegeven :P
Overigens vergeet je te vertellen dat je het form ook even moet un-hooken. Dit gaat ook klappen namelijk :Y)

[ Voor 18% gewijzigd door RobIII op 15-07-2005 01:04 ]

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


  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 19-03 00:48

ZaZ

Tweakers abonnee

RobIII schreef op vrijdag 15 juli 2005 @ 01:01:
[...]

Zo'n goede bui dat je maar even voor hem gegoogled hebt? (Origineel) Ik dacht dat ik voldoende hints had gegeven :P
Overigens vergeet je te vertellen dat je het form ook even moet un-hooken. Dit gaat ook klappen namelijk :Y)
ben het wel eens op google tegengekomen idd, en heb het toen voor iets gebruikt. dus ik had het op mijn HD opgezocht :)
over het un-hooken: da's vanzelfsprekend natuurlijk

Lekker op de bank


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
RobIII schreef op vrijdag 15 juli 2005 @ 00:10:
[...]

Early optimization is the root of much all evil :P (vrij naar Knuth)
Een thread.sleep gooit gewoon je app een "slaapstand" en daarmee dus "ruimte" makend voor andere processen. Ja, je CPU usage daalt naar een laag percentage, maar is dit niet hakken met een botte bijl? Pak liever het probleem bij de wortels aan: Waarom heb je een 100% CPU usage? (En als dat "onvermijdelijk" is, throttle dan je thread spreek dat eens uit :P naar een lagere prio ofzo).

[...]
Het gaat om een functie in een los draaiende thread welke moet wachten tot een bepaald Window actief wordt. Daarbij is het, mijns inziens, totaal geen slecht idee om ff een Thread.Sleep in te bouwen :)

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 vrijdag 15 juli 2005 @ 10:59:
[...]


Het gaat om een functie in een los draaiende thread welke moet wachten tot een bepaald Window actief wordt. Daarbij is het, mijns inziens, totaal geen slecht idee om ff een Thread.Sleep in te bouwen :)
Mijn punt is/was: Waarom zou je gaan piten met een Sleep om om de zoveel tijd op te staan om te kijken of er al iets gebeurd is, als je gewoon kunt gaan pitten en worden gewekt met een Notify? Scheelt weer pollen :Y)

[ Voor 5% gewijzigd door RobIII op 15-07-2005 12:21 ]

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: 04-05 13:09
Jajaja... Maar het ging ook om het (recursief) zoeken naar of wachten op het enablen van controls :P

Wat betreft het wachten op een notify bij het Clipboard heb je natuurlijk helemaal gelijk. Maar wat je eerder zei over dat pollen echt niet duur [is/hoeft te zijn] heb je óók een punt ;)

[ Voor 49% gewijzigd door riezebosch op 15-07-2005 13:10 ]

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

Pagina: 1