[VB6] sendkeys "^c" en plakken

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

  • mmy841
  • Registratie: Juli 2004
  • Laatst online: 09-07-2021
Ik heb een formulier (steeds op de voorgrond) met een knop op. Indien op deze knop wordt gedrukt, dan zou de geselecteerde tekst in een andere toepassing gekopieerd moeten worden naar het geheugen.

Mijn code werkt als volgt (een selectie is reeds gemaakt in andere software):
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'1) formulier minimaliseren, zodat de applicatie waarin een tekst geselecteerd is op de voorgrond staat
frmMain.hide

'2) kleine vertraging, zo ben ik zeker dat frmMain zeker geminimaliseerd is (gaf problemen zonder deze regel)
sleep(200) 

'3) ctrl c simuleren = kopiëren (op voorwaarde dat de applicatie waar de tekst geselecteerd is deze toetsencombinatie kent)
sendkeys "^c", true      

'4) formulier terug tonen
frmMain.show              

'5) inhoud klembord plakken in tekstveld
txtTekstveld.Text = Clipboard.GetText

Deze code werkt zonder problemen bij de meeste (standaard) applicaties zoals word, excel, IE, ...
Maar in sommige gevallen wordt niet altijd de geselecteerde tekst gekopieerd (ctrl c wordt wel herkend door de applicatie met de selectie in). In andere gevallen werkt het een tijdje probleemloos, daarna moet men meerdere keren klikken, ...

Weet iemand waaraan dit zou kunnen liggen. Ik heb al geprobeerd om de vertraging te verhogen (geen resultaat), of eerst het klembord leeg te maken (clipboard.clear). Het lijkt me dat na het kopiëren niet altijd gewacht wordt tot de selectie effectief in het geheugen staat.

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 18-02 13:45
Als dat het geval is, zou je eens kunnen kijken naar DoEvents

  • mmy841
  • Registratie: Juli 2004
  • Laatst online: 09-07-2021
DoEvents heb ik ook getest, zonder resultaat echter (getest zowel voor als na elke regel code). Ik heb echt geen idee meer waaraan dit zou kunnen liggen

Edit: Voor personen met gelijkaardige problemen: Ik heb volgende code gevonden om sendkeys te vervangen door het keybd_event (dit zou stabieler moeten zijn).
Visual Basic:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Const KEYEVENTF_EXTENDEDKEY = &H1
Private Const KEYEVENTF_KEYUP = &H2

Public Sub KeyDown(KCC As KeyCodeConstants)
    keybd_event KCC, 0, 0, 0
End Sub

Public Sub KeyUp(KCC As KeyCodeConstants)
    keybd_event KCC, 0, KEYEVENTF_KEYUP, 0
End Sub

Public Sub KeyPress(KCC As KeyCodeConstants)
    KeyDown KCC
    KeyUp KCC
End Sub

Public Sub CtrlOnn()
    KeyDown vbKeyControl
End Sub

Public Sub CtrlOff()
    KeyUp vbKeyControl
End Sub

Private Sub Command1_Click()
    
    Text1.Text = ""
    Form1.Hide
    DoEvents
    
    Call CtrlOnn
    DoEvents
    Call KeyDown(vbKeyC)
    DoEvents
    Call KeyUp(vbKeyC)
    DoEvents
    Call CtrlOff

    Form1.Show
    DoEvents
    Text1.SetFocus
    
    Call CtrlOnn
    DoEvents
    Call KeyDown(vbKeyV)
    DoEvents
    Call KeyUp(vbKeyV)
    DoEvents
    Call CtrlOff

End Sub

[ Voor 82% gewijzigd door mmy841 op 24-05-2006 10:27 ]


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 14-02 12:54
How to: Write to the Clipboard in Visual Basic

Nadeel is dat je niet altijd zomaar rechten hebt in andere applicaties gegevens uit te lezen, en moet je daar allerhande truuks voor uithalen. Maar kopieren door een CTRL+C te simuleren lijkt mij nogal evil...

[ Voor 50% gewijzigd door riezebosch op 24-05-2006 12:57 ]

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