Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: symulacja wciśnięć klawiszy
maciek




Typ: neutral
Postów: 9
Zarejestrowany: Jul 2004
symulacja wciśnięć klawiszy

Mam następujący problem: czy istnieje możliwość - chociażby za pośrednictwem SendMessage - symulacji wciśnięcia klawisza / kombinacji klawiszy w dowolnym oknie jakiegoś programu (IE, Word) (w odpowiedzi na jakieś zdarzenie w moim programie VB)? Będę bardzo wdzięczny za wszelkie rady.

31-07-2004 18:02
Pokaż profil maciek  Wyślij email do maciek   Odwiedź stronę maciek  
losmac
"profesorek"




Typ: neutral
Postów: 758
Zarejestrowany: May 2003

NIe wiem, czy o to Ci chodzi, ale wykorzystaj funkcję SendKeys(). Działa tak, jakbyś to Ty naciskał klawisz w jakimś oknie.

A to pochodzi z pliku pomocy:

W tym przykładzie wykorzystano funkcję Shell do uruchomienia aplikacji Kalkulator systemu Microsoft Windows. Za pomocą funkcji SendKeys symulowane są naciśnięcia klawiszy w celu dodania liczb i zakończenia pracy Kalkulatora. Instrukcja SendKeys nie jest dostępna w systemie Macintosh. (Aby obejrzeć działanie tego przykładu, należy wkleić go do procedury, a następnie wykonać ją. Ponieważ instrukcja AppActivate przekazuje fokus do Kalkulatora, nie można wykonywać tego kodu programu krokowo.)

Dim ZwracWart, I
ZwracWart = Shell("CALC.EXE", 1) ' Uruchom Kalkulator.
AppActivate ZwracWart  ' Uaktywnij Kalkulator.
For I = 1 To 100' Rozpocznij pętlę.
SendKeys I & "{+}", True
  ' Wysyłaj naciśnięcia klawiszy do Kalkulatora,
Next I  ' aby dodać każdą kolejną wartość I.
SendKeys "=", True  ' Wyświetl sumę końcową.
SendKeys "%{F4}", True
  ' Wyślij kombinację ALT+F4, aby zamknąć Kalkulator.



_____________________________________________
POSTULATY STARUSZKA:
1) Ludzie, dbajcie o polszczyznę!!!
2) Ludzie, zadawajcie kompletne pytania, a nie rzucacie ochłapy i trzeba się domyślać o co chodzi!!!

Powodzenia
Maciej Łoś

02-08-2004 07:44
Pokaż profil losmac  Wyślij email do losmac   Odwiedź stronę losmac  
maciek




Typ: neutral
Postów: 9
Zarejestrowany: Jul 2004
DZIĘKI DZIĘKI DZIĘKI!!!

Funkcja jest cool i w dodatku wewnętrzna vb, proszę proszę :-). Oto właśnie chodziło, ale... Niestety, nie rozwiązało to mojego problemu do końca. Może wytłumaczę od początku do końca: otóż chcę w moim programie (jest dostępny freeware: www.niemiecki.vbaction.net) umieścić mechanizm szybkiego tłumaczenia wskazanych przez użytkownika słówek np. w oknie przeglądarki internetowej. Używam takiego ciągu instrukcji: najpierw kontrolka SysHook (do pobrania, wraz z całym omawianym przeze mnie algorytmem: www.vbaction.net/syshook.zip) "wykrywa" dwukrotne kliknięcie w wyraz w przeglądarce; ten wyraz oczywiście się zaznacza, więc dzięki temu instrukcja podana przez Losmaca, Sendkeys, może wysłać do okna IE kombinację CTRL+C i dzięki temu następuje skopiowanie wyrazu; ta sama, co wcześniej, kontrolka wychwytuje wciśnięcie klawiszy i wyciąga ze Schowka (OpenClipboard) wyraz do pola, w które normalnie wpisuje się słówka. Działa WSZYSTKO, poza jednym "szczegółem": nie następuje skopiowanie wyrazu w odpowiedzi na CTRL+C. Nie wiem, czemu. Próbowałem wysyłać np. polecenie ALT+F4 i działa, iexplorer reaguje. Być może problem tkwi w pomijaniu przeze mnie instrukcji AppActivate, ale nie wiem, jak jej użyć, gdy przeglądarka jest już otwarta. Jeśli ktoś ma czas, a nie jest takim luserem jak ja (od dawna traktuję VB głownie jako narzędzie do robienia tego programu i nie rozwijam się od strony teoretycznej :-/), prosiłbym o przyjrzenie się temu projektowi (link powyżej). Sama kontrolka może się wielu osobom przydać, a pewnie nie wszyscy ją mają. Pozdrawiam

02-08-2004 14:16
Pokaż profil maciek  Wyślij email do maciek   Odwiedź stronę maciek  
losmac
"profesorek"




Typ: neutral
Postów: 758
Zarejestrowany: May 2003
more info

Co do SendKeys()


Każdy klawisz jest reprezentowany przez jeden lub więcej znaków. Aby przesłać jeden znak umieszczony na klawiaturze, jako wartość należy podać ten znak. Na przykład, aby przesłać literę A, argumentowi string należy nadać wartość "A". Aby przesłać więcej niż jeden znak, należy dołączać kolejne znaki do ciągu. I tak, aby przesłać litery A, B i C, argumentowi string należy nadać wartość "ABC".
Znaki plus (+), daszek (^), procent (%), tylda (~) i nawiasy okrągłe ( ) mają w instrukcji SendKeys specjalne znaczenie. Aby przesłać dowolny z tych znaków, należy umieścić je w nawiasach klamrowych {}. Na przykład, aby przesłać znak plus, należy napisać{+}. Nawiasy kwadratowe ([ ]) nie mają specjalnego znaczenia w instrukcji SendKeys, jednakże muszą być one umieszczane w nawiasach okrągłych. Mogą one mieć znaczenie w innych aplikacjach, np. przy dynamicznej wymianie danych (DDE). Aby przesłać nawiasy klamrowe, należy wpisać {{} i {}}.

Znaki, które nie są wyświetlane po naciśnięciu klawisza, takie jak ENTER czy TAB, oraz klawisze oznaczające akcje a nie znaki są reprezentowane przez następujące kody:

KlawiszKod
BACKSPACE{BACKSPACE}, {BS} lub {BKSP}
BREAK{BREAK}
CAPS LOCK{CAPSLOCK}
DEL lub DELETE{DELETE} lub {DEL}
STRZAŁKA W DÓŁ{DOWN}
END{END}
ENTER{ENTER}lub ~
ESC{ESC}
HELP{HELP}
HOME{HOME}
INS lub INSERT{INSERT} lub {INS}
STRZAŁKA W LEWO{LEFT}
NUM LOCK{NUMLOCK}
PAGE DOWN{PGDN}
PAGE UP{PGUP}
PRINT SCREEN{PRTSC}
STRZAŁKA W PRAWO{RIGHT}
SCROLL LOCK{SCROLLLOCK}
TAB{TAB}
STRZAŁKA W GÓRĘ{UP}
F1{F1}
F2{F2}
F3{F3}
F4{F4}
F5{F5}
F6{F6}
F7{F7}
F8{F8}
F9{F9}
F10{F10}
F11{F11}
F12{F12}
F13{F13}
F14{F14}
F15{F15}
F16{F16}
Aby przesłać kombinację klawisza z klawiszami SHIFT, CTRL, lub ALT, należy poprzedzić kod klawisza odpowiednimi kodami z poniższej tabeli:

KlawiszKod
SHIFT+
CTRL  ^
ALT%
Aby określić, że klawisze SHIFT, CTRL lub ALT mają być wciśnięte w momencie naciskania kilku innych klawiszy, należy kody tych klawiszy ująć w nawias. Na przykład, aby określić, że ma być wciśnięty klawisz SHIFT, podczas naciskania klawiszy E i C,  należy napisać "+(EC)". Aby określić, że klawisz SHIFT ma być wciśnięty tylko podczas naciskania klawisza E, należy napisać "+EC".

Aby określić kolejne naciśnięcia tego samego klawisza, należy napisać{klawisz liczba}. Parametry klawisz i liczba muszą być rozdzielone spacją. Na przykład, {LEFT 42} oznacza, że kod klawisza STRZAŁKA W LEWO ma zostać wysłany 42 razy; {h 10} oznacza, że kod klawisza H zostanie wysłany 10 razy.

Uwaga  Za pomocą funkcji SendKeys nie można wysyłać naciśnięć klawiszy do aplikacji, która nie została zaprojektowana dla systemu Microsoft Windows. Sendkeys nie umożliwia również wysłania klawisza PRINT SCREEN {PRTSC} do żadnej aplikacji.



Co do AppActivate()


Uaktywnia okno aplikacji.

Składnia

AppActivate title[, wait]

Składnia instrukcji AppActivate zawiera następujące nazwane argumenty:

ArgumentOpis
titleArgument obowiązkowy. Wyrażenie znakowe określające tekst umieszczony na pasku tytułu uaktywnianego okna aplikacji. W celu uaktywnienia aplikacji zamiast argumentu title można również użyć identyfikatora zadania zwracanego przez funkcję Shell.
waitArgument nieobowiązkowy. Wartość typu Boolean która określa, czy aplikacja wołająca inną aplikację ma fokus. Wartość False (domyślnie) powoduje, że wywoływana aplikacja jest uaktywniana niezależnie od tego, czy aplikacja miała fokus. Wartość True powoduje, że aplikacja wołająca czeka, aż zostanie do niej przekazany fokus, a następnie uaktywnia podaną aplikację.
Użycie

Instrukcja AppActivate przenosi fokus na podaną aplikację lub okno, ale nie wpływa na to, czy aplikacja jest minimalizowana czy maksymalizowana. Fokus jest przenoszony z okna uaktywnionej aplikacji, gdy użytkownik wykonuje czynność związaną ze zmianą fokusu lub zamyka okno dialogowe. Aby uruchomić aplikację lub ustawić styl okna, należy użyć funkcji Shell.
Podczas określania, która aplikacja ma zostać uaktywniona, argument title jest porównywany z tytułami wszystkich aktualnie działających aplikacji. Jeśli żaden z tytułów okien nie jest zgodny z porównywanym wzorcem, uruchamiana jest ta aplikacja, dla której początkowa część tytułu odpowiada wartości argumentu title. Jeśli istnieje więcej instancji aplikacji o podanym title, zostanie wybrana jedna w nich.

Niniejszy przykład ilustruje zastosowanie instrukcji AppActivate do uaktywnienia okna aplikacji (otwartej).

Dim MojaApID, WartZwrac
' W Microsoft Windows:
AppActivate "Microsoft Word"' Uaktywnij program
' Microsoft Word.



_____________________________________________
POSTULATY STARUSZKA:
1) Ludzie, dbajcie o polszczyznę!!!
2) Ludzie, zadawajcie kompletne pytania, a nie rzucacie ochłapy i trzeba się domyślać o co chodzi!!!

Powodzenia
Maciej Łoś

02-08-2004 16:06
Pokaż profil losmac  Wyślij email do losmac   Odwiedź stronę losmac  
maciek




Typ: neutral
Postów: 9
Zarejestrowany: Jul 2004
Dzięki!!!

No cóż, dalej nie działa - widać sęk tkwi chyba gdzieś indziej... Będę jeszcze w tym dłubał, ale to chyba jest zbyt skomplikowane dla mnie - męczę się już rok z tym problemem
Pozdrawiam!

02-08-2004 16:52
Pokaż profil maciek  Wyślij email do maciek   Odwiedź stronę maciek  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

A masz uchwyt do okna tego programu? Jeśli tak, to możesz spróbować wysłać WM_CHAR do tego okna z odpowiednim parametrem (wParam= kod_klawisza, lParam = opcje). Nie sprawdzałem, ale powinno działać.

Tutaj daję link do MSDN z opisem użycia WM_CHAR:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputmessages/wm_char.asp

Tzn. powinno działać symulowanie naciśniećia klawiszy!
Czy zadziała kombinacja Ctrl+C nie wiem.

[Post edytowany dnia 03-08-2004 18:41 przez marcin_an]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

03-08-2004 18:40
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Kurczę, właśnie zauważyłem, że trudno ci będzie wysłać Ctrl+C z WM_CHAR.

Dlatego wymyśliłem jeszcze dwie możliwosci:
1) Użyj WM_KEYDOWN i WM_KEYUP z odpowiednimi parametrami. Najpierw KeyDown z Ctrl, potem WMChar z C, na koniec KeyUp z Ctrl. (linka nie daję, bo taki sam - wystarczy tylko, że wybierzesz te funkcje w drzewku po lewej).

2) Jeśli będzie to zawsze ta sama aplikacja i będziesz wiedział gdzie znajduje się w menu opcja "Wklej", to możesz symulować wywołanie tej funkcji z menu.

!!! narazie w teorii, nie wiem, czy działa

[Post edytowany dnia 03-08-2004 18:45 przez marcin_an]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

03-08-2004 18:44
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
maciek




Typ: neutral
Postów: 9
Zarejestrowany: Jul 2004
:((

Ja być lamer i nie rozumieć ;(. To coś na MSDN to jakąś straszną składnię mieć - C++, czy nie daj Boże VB.NET, którego na oczy nie widziałem... A poza tym uchwytu raczej tak łatwo nie pobiorę, skoro ten mechanizm miałby służyć do (prawie) każdego okna każdego programu?...

03-08-2004 22:23
Pokaż profil maciek  Wyślij email do maciek   Odwiedź stronę maciek  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Rozumiem.. czyli najpierw będę musiał sam sprawdzić, a potem prowadzić krok po kroczku ...

A w jaki sposób będzie wybierane okno, do którego ma zostać wysłany "Ctrl+C"?


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

03-08-2004 22:26
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
maciek




Typ: neutral
Postów: 9
Zarejestrowany: Jul 2004
:)

Dziękuję bardzo za zainteresowanie moim problemem... Miałem nadzieję, że uda się bez wskazywania okna; dotychczas użytkownik po prostu czytał sobie jakiś tekst w wordzie czy explorerze (ten program to słownik niemiecko-polski), zaznaczał dane słowo i wciskał CTRL+C. I słowo ładowało się do pola, w które się je normalnie wpisuje przeglądając bazę wyrazów.
Dawało się tak dzięki kontrolce SystemHook, notabene chyba napisanej w C++; znajomy mi ją podrzucił jakoś przed rokiem. Jest ona, wraz z małym projektem, który ilustruje mój problem, do ściągnięcia z www.vbaction.net/syshook.zip. Teraz chciałem przy jej pomocy wprowadzić reakcję na dwuklik w słowo, bo tak jest wygodniej.
Kod zamieszczony pod tym adresem wykorzystuje instrukcję Sendkeys, która jednak nie działa (tzn. w pewnym sensie działa, bo kontrolka systemhook wykrywa fakt wciśnięcia CTRL+C, ale samo kopiowanie nie następuje). Jeśli coś wymyślisz, będę bardzo wdzięczny. Programik ma te parę(naście) tysięcy użytkowników, więc, jeśli Ci to nie przeszkadza, w razie sukcesu umieszczę podziękowanie dla Ciebie w oknie "o programie" za pomoc z tą instrukcją - dla słownika dość ważną; ma ją choćby komputerowy Langenscheidt.
Pozdrawiam

03-08-2004 23:44
Pokaż profil maciek  Wyślij email do maciek   Odwiedź stronę maciek  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

No więc sprawy wyglądają tak:
Spróbowałem wysłać ten komunikat do okna i nie nastąpiło kopiowanie - co więcej - przy tradycyjnym wciśnięciu "Ctrl+C" okno "nie wie", że te klawisze zostały wciśnięte.
Miałem zamiar od razu odpowiedzieć, ale jak widać - nie będzie to możliwe.
Postaram się coś wykombinować i odpowiedzieć do jutrzejszego wieczora.

---
Mam małą prośbę. Mógłbyś ten wątek zacząć jeszcze raz na forum dotyczącym VB (http://board.freeweb.pl/subjects.php?board_id=1543&division=615)? Problem jest troszkę trudniejszy niż myślałem i prawdopodobnie przyda się (choćby mi) pomoc kilku osób na forum. A tutaj zdecydowanie mniej ludzi zagląda. Tylko dopisz, że wysyłanie "Ctrl+C" do okna nie działa (w razie pytań skomentuję dlaczego).

[Post edytowany dnia 04-08-2004 00:28 przez marcin_an]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

04-08-2004 00:19
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
maciek




Typ: neutral
Postów: 9
Zarejestrowany: Jul 2004
OK

OK, jeszcze raz dzięki za pomoc; zredagowałem posta w dziale VB, tylko nie wiem, czy zbyt sensownie
Pozdrawiam

04-08-2004 01:56
Pokaż profil maciek  Wyślij email do maciek   Odwiedź stronę maciek  
Wszystkich odpowiedzi: 11 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1