Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Bei Sendkeys Funktion wird NUM-Lock deaktiviert

Begonnen von cyberchris, November 08, 2012, 21:56:31

⏪ vorheriges - nächstes ⏩

cyberchris

Guten Abend,

ich habe mir eine Funktion mittels Sendkeys gebastelt, die per Button den Windows-Explorer in einem bestimmten Verzeichnis öffnet und ein Suchbegriff eingibt. Nur ist es leider so, dass dabei komischerweise immer NUM-Lock deaktiviert wird, also das Zahlenfeld nicht aktiviert ist.
Habe ich da irgendwo einen Fehler gemacht? Ich habe auch nicht gefunden, mit welchem Sendkeys Befehl man den NUM-Lock aktiviert oder deaktiviert...

Hier mein Code:

Dim Verzeichnis As String
Verzeichnis = DFirst("Verz_Archiv_Pruefprot", "werk")
Dim fs As Object
Set fs = CreateObject("Scripting.FileSystemObject")
   If Left(WindowsVersion, 1) = "2" Then (prüft die Windowsversion, da unter WIN7 das Suchen anders funktioniert)
       If Mid(WindowsVersion, 3, 1) <= 5 Then
           ShellExecute 0, "find", verzPP, "", "", SW_SHOWNORMAL
           apiSleep 1500
           SendKeys IDoWAG, True
           apiSleep 500
           SendKeys "{ENTER}", True
       End If
       If Mid(WindowsVersion, 3, 1) >= 6 Then (prüft die Windowsversion, da unter WIN7 das Suchen anders funktioniert)
           Shell "explorer.exe " & verzPP, vbNormalFocus
           apiSleep 1500
           SendKeys "^(f)", True
           apiSleep 500
           SendKeys IDoWAG, True
       End If
   End If
Set fs = Nothing

Vielen Dank & Gute Nacht :-)
Gruß Christoph

bahasu

Hi,

siehe auch: http://www.access-o-mania.de/forum/index.php?topic=15871.msg91760;topicseen#msg91760

Mögliche Lösung bei:
http://www.vbarchiv.net/tipps/details.php?id=542
http://access.mvps.org/access/api/api0046.htm

Harald
Servus

cyberchris

#2
Hi,

danke für den Tipp.
Habs mit der Funktion SendKeysEx versucht (http://www.vbarchiv.net/tipps/details.php?id=542)

Das Problem mit dem Num-Lock habe ich nicht mehr.

Komme aber dafür nicht mehr in das Suchfeld bei Windows 7
SendKeysEx "^(f)"

Explorer geht auf. Und manuell komme ich mit STRG + f dahin...
Muss der Befehl bei SendkeysEx anders geschrieben werden?

Danke
gruß Christoph

bahasu

Hi,

im zweiten Hilfslink gibt es Routinen (z.B. ToggleNumLock), um numlock abzufragen und einzustellen.

Harald
Servus

tobias.vetter

Hallo liebes Forum,
leider muss ich mich auf das alte Thema noch einmal draufsetzen.

Access soll über VBA folgende Tasten gleichzeitig drücken:

CTRL+SHIFT+C

Dies dient zur Übergabe eines Stings an unsere Telefonsoftware.

Über
SendKeys "+^c", True
funktioniert es ja auch, bis auf den Fehler mit dem Nummernblock.
Jetzt wollte ich die Hilfestellung aus Post 2 VBArchiv nutzen. leider ist dieser Code nur für 32Bit Versionen geschrieben und ich kann ihn in der 64bit Variante nicht einfügen.

Wie schreibe ich diesen Code um?
Für eine Hilfestellung oder den fertig umgeschriebenen Code wäre ich sehr dankbar.

Liebe Grüße und ein dickes Danke vorab

Tobias

PhilS

Zitat von: tobias.vetter am Februar 15, 2023, 17:11:39Jetzt wollte ich die Hilfestellung aus Post 2 VBArchiv nutzen. leider ist dieser Code nur für 32Bit Versionen geschrieben und ich kann ihn in der 64bit Variante nicht einfügen.

Wie schreibe ich diesen Code um?
Auf einen flüchtigen Blick sieht es für mich so aus, als müsstest du nur "PtrSafe" in die Deklarationen der API-Funktionen einfügen.
Also:
Private Declare PtrSafe Sub ...
bzw.:
Private Declare PtrSafe Function ...

Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

tobias.vetter

#6
Danke für die PtrSafe erläuterung.
Trotzdem sitze ich auf dem Schlauch.
Das Modul ist eingefügt und nun auch praktizierbar.

Jedoch erfolgt unter folgendem Code,
If Nz(typkont_id_f) = "1" Then '1 = Telefon
Kont_wert.SetFocus
Kont_wert.SelStart = 0
Kont_wert.SelLength = Len(Kont_wert.Text)
SendKeysEx "+^c", True
End If

dass nur ein C in das Textfeld "Kont_wert" übergeben werden und nicht an die CloudPBX Software der vorher extrahierte String

Edit:
Folgendes soll passieren:
Beim Doppelklick auf das Feld typkont_id_f, soll der Wert aus "Kont_wert" markiert werden.
Danach soll Access Control Shift und C gleichzeitig drücken.
Diese Tastenkombination löst in der CloudPBX software ein Wählvorgang aus.

Nochmals vorab danke für eure Hilfe
Grüße Tobias

PhilS

Zitat von: tobias.vetter am Februar 16, 2023, 07:53:34Folgendes soll passieren:
Beim Doppelklick auf das Feld typkont_id_f, soll der Wert aus "Kont_wert" markiert werden.
Danach soll Access Control Shift und C gleichzeitig drücken.
Ich kenne mich weder mit dem originalen SendKeys, noch mit dem oben genanten SendKeysEx aus und kann daher wenig helfen.
Allerdings sagt die Microsoft Dokumentation zum eingebauten SendKeys:
ZitatTo specify that any combination of SHIFT, CTRL, and ALT should be held down while several other keys are pressed, enclose the code for those keys in parentheses. For example, to specify to hold down SHIFT while E and C are pressed, use +(EC).

Falls das für SendKeysEx genauso gilt, müsstest du schreiben:
SendKeysEx "+^(C)", True
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

markusxy

Zitat von: tobias.vetter am Februar 16, 2023, 07:53:34dass nur ein C in das Textfeld "Kont_wert" übergeben werden und nicht an die CloudPBX Software der vorher extrahierte String

Erstmal solltest du deinen alten Code zeigen, der ja grundsätzlich funktioniert.

Zweites, frage ich mich, ob es da keine andere Möglichkeit gibt mit der Anwendung zu kommunizieren.
Die gewählte Vorgehensweise scheint mir doch sehr primitiv - also z.B. irgend eine DLL die mittels VBA direkt angesprochen werden kann.

Drittens - hast du überprüft, ob dein String innerhalb von SendKeysEx richtig umgesetzt wird?

tobias.vetter

#9
Hallo Markusxy,

das hier ist der alte Code, welcher auch funktioniert, bis auf das ausschalten des Nummernblocks
If Nz(typkont_id_f) = "1" Then '1 = Telefon
Kont_wert.SetFocus
Kont_wert.SelStart = 0
Kont_wert.SelLength = Len(Kont_wert.Text)
SendKeys "+^c", True
End If
Hier wird der Inhalt in Kont_wert markiert und danach Strg Shift und C gleichzeitig gedrückt.
Durch diesen Shortcut erkennt die Telekomanwendung, dass die in Kont_wert markierte Telefonnummer gewählt werden soll.
Der Shortcut Strg Shift C wird durch das Programm der Telekom vorgegeben.

Gerne bin ich bereit eine andere Lösung zu inizialisieren, wenn mir dabei jemand hilft und mich in die richtige Richtung lenkt.

Grüße und Danke

markusxy

Zitat von: tobias.vetter am Februar 16, 2023, 11:10:17Der Shortcut Strg Shift C wird durch das Programm der Telekom vorgegeben.

Das ist schon klar.
Die Frage ist, ob es keine andere Schnittstelle gibt.
Da müsstest du beim Hersteller nachfragen bzw. in der Doku nachsehen.

Ich hab mal kurz SendKeysEx angesehen.
Wenn du mich fragst ist die Umsetzung nicht korrekt.
Die Steuertasten müssten ja gemeinsam gedrückt werden.
Es gibt aber ein release bevor das Senden vollständig ist.
Eine saubere Umsetzung erfordert da eine weit höhere Komplexität.
Hab mich aber mit dem Konzept nicht ausführlich beschäftigt.
Du könntest dich ja damit beschäftigen und die API direkt nutzen, und die Funktion mal vergessen.  ;D

Die Frage bleibt natürlich, warum SendKeys zu dem Problem führt.
Möglicherweise hat der Befehl selbst damit wenig zu tun, und das Programm verursacht das Problem. Meine Vermutung wäre ja das SendKeys im Hintergrund auch mit den KeyEvents arbeitet.

Es gibt aber auch Anleitungen um den Num-Block wieder zu aktivieren.


tobias.vetter

Hallo Markusxy,
lt. Telekom liegt das Problem an meiner Access Datenbank.
Tatsächlich tritt das Problem auch nur nach dem Sendkeys befehl auf.

Ich hab mir nie tiefgründigere Gedanken über die simple Form von Sendkeys gemacht.
Hat ja gespielt, bis auf den Nummernblock.

Die einfachste Lösung war bzw. ist

SendKeys "{NUMLOCK}", Truenachzuschicken.

Jedoch ist damit das "richtige Problem" nicht behoben, denn jeder rät ja von der Sendkey Methode ab.

Ich bin leider kein Entwickler oder ITler sondern stumpfer Anwender.
Deswegen wird es mit API und Co etwas schwierig für mich.

Grüße und vielen Dank

markusxy

Zitat von: tobias.vetter am Februar 16, 2023, 13:16:04denn jeder rät ja von der Sendkey Methode ab.

Ja, es gibt bessere Wege.
Aber in diesem Fall, muss die Tastenkombination quasi für die Anwendung "reserviert" werden.
Ein Problem wird es erst, wenn zwei verschiedene Anwendungen versuchen die selbe Tastenkombination zu nutzen.

Probleme gibt es in der Praxis eher, wenn Informationen an ein Fenster einer anderen Anwendung geschickt werden müssen.