Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: symulacja wciśnięć klawiszy w oknie innego programu za pomocą Sendkeys lub WM_CHAR (niedziałające CTRL+C)
maciek




Typ: neutral
Postów: 9
Zarejestrowany: Jul 2004
symulacja wciśnięć klawiszy w oknie innego programu za pomocą Sendkeys lub WM_CHAR (niedziałające CTRL+C)

Mam problem z implementacją w programie instrukcji, która wysyłałaby do okna Worda, IE itp. kombinację klawiszy CTRL+C (w odpowiedzi na dwukrotne kliknięcie w dany wyraz - zdarzenie to rejestruje kontrolka SystemHook, którą można pobrać stąd). Ta sama kontrolka wykrywa wciśnięcie tej kombinacji, co ma na celu załadowanie ze schowka skopiowanego wyrazu do pola tekstowego w moim programie. Niestety, samo skopiowanie nie następuje... Jakby ktoś się dziwił, po co mi to - jest to instrukcja do słownika (niemiecko-polskiego), która bardzo się użytkownikom przydaje przy czytaniu stron internetowych, dokumentów wordowskich itp. w obcym języku.

04-08-2004 01:54
Pokaż profil maciek  Wyślij email do maciek   Odwiedź stronę maciek  
marcin_an
Forumowicz




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

Dopisuję swoje wyjasnienia i spostrzeżenia dla kolejnych komentujacych:

Wysyłanie Ctrl+C nie skutkuje. Tzn. dochodzi to do okna, ale należy pamietać, że to nie okno przetwarza kombinacje klawiszy. Robi to wątek korzystając z tablic akceleratorów. I teraz mam pewien problem. Głowiłem się całą noc i widzę w tej chwili tylko dwie możliwości:
1) Wysłać Ctrl+C do thread queue (ktoś ma pomysł jak?)
2) Wysłać WM_COMMAND do okna - ale wtedy trzeba wiedzieć, który command odpowiada "Ctrl+C"... ktoś ma jakieś pomysły?

Zastanawiałem się jeszcze nad pobieraniem pozycji kursora, okna tekstowego... ale to wszystko odpada, gdy się weźmie pod uwagę, że nie wiadomo w jakim programie będziemy pracowali.

Jeśli ktoś ma jakieś pomysły - ja też czekam na odpowiedź.

A dla Maćka: jeśli chcesz to robić dwukrotnym kliknięciem na tekst to może być mały problem - większosc programów dwukrotnemu kliknięciu na tekst przypisało swoje własne funkcje. Głownie dotyczące znaznaczania - po dwukrotnym kliknięciu może się okazać, że zaznaczone jest co innego, niż użytkownik chciał zaznaczyć.


_____________________________________________
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 08:50
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
maciek




Typ: neutral
Postów: 9
Zarejestrowany: Jul 2004
hmm...

Powiem tylko (na pociechę?), że słownik Young Digital Poland to umie, nawet w normalnym oknie dialogowym (oczywiście w miejscu, gdzie można tekst zaznaczyć)... Czyli jakoś jest to możliwe... I chyba mają coś podobnego do tego, nad czym kombinujemy, bo "dwukliknięty" wyraz jest kopiowany do Schowka!

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




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

Wiem, że jest możliwe - musi być. Tylko jak? Spróbuję jeszcze po prostu wysłać WM_COMMAND - może zadziała. Tzn. w oknach ze standardowym menu textboxa (Zaznacz wszystko/Kopiuj/WKlej/Wytnij/Cofnij) będzie działało - tylko nie wiem, jak sobie poradzi z programami, gdzie jest to bardziej zaawansowane...


_____________________________________________
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

05-08-2004 13:42
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

Wpadłem na coś:
WM_COPY powoduje skopiowanie tego, co jest aktualnie zaznaczone.

Problem polega na tym, ze teraz trzeba znaleźć funkcję, która bedzie nam podawało aktywne okno (to,w  którym rpacuje użytkownik). Czekam na pomysły, chyba, ze sam na coś trafię.


_____________________________________________
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

05-08-2004 14:16
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
mikmas
From Łódź Stadt




Typ: neutral
Postów: 772
Zarejestrowany: Apr 2003

Hmm... Jeżeli dobrze rozumiem, to potrzebujesz funkcję, która wydłubie hwnd aktywnego okna? Jeśli tak to zapraszam do api-guide funkcja GetActiveWindow


_____________________________________________
4C;65;70;69;65;6A;20;62;79;9C;20;73;69;EA;20;
62;61;72;64;7A;69;65;6A;20;73;6B;6F;6E;63;65;
6E;74;72;6F;77;61;B3;20;6E;61;20;6F;64;70;6F;
77;69;65;64;7A;69;2C;20;61;20;6E;69;65;20;6E;
61;20;72;6F;7A;73;7A;79;66;72;6F;77;79;77;61;
6E;69;75;20;3A;50

05-08-2004 14:26
Pokaż profil mikmas  Wyślij email do mikmas   Odwiedź stronę mikmas       3632553
marcin_an
Forumowicz




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

Mówimy o dowolnym oknie.

GetActiveWindow pozwala tylko na pobranie uchwytu do okna znajdującego się w programie wywołującym tę funkcję.

Już znalazłem rozwiazanie.
W deklaracjach dajemy:
Public Const WM_COPY = &H301

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function GetForegroundWindow Lib "user32" () As Long
Public Declare Function AttachThreadInput Lib "user32" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long
Public Declare Function GetFocus Lib "user32" () As Long
Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long

A w kodzie programu kopiowanie wygląda tak:
AttachThreadInput App.ThreadID, GetWindowThreadProcessId(GetForegroundWindow, nDummy), True
SendMessage GetFocus, WM_COPY, 0, 0
AttachThreadInput App.ThreadID, GetWindowThreadProcessId(GetForegroundWindow, nDummy), False


Uwaga: kod nie będzie działał pod WindowsNT.

Zostało sprawdzone pod Win98SE i działa.
Skopiowany tekst trafia do schowka.


_____________________________________________
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

05-08-2004 14:32
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
maciek




Typ: neutral
Postów: 9
Zarejestrowany: Jul 2004
a jest szansa, żeby coś zmienić i żeby zadziałało?

To pewnie pod WinXP też nie zadziała? Mam NT 5.0 czyli "2000", jak chce Microsoft, i nie działa...

05-08-2004 14:46
Pokaż profil maciek  Wyślij email do maciek   Odwiedź stronę maciek  
marcin_an
Forumowicz




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

Po systemami NT-owymi nie działa ze wzgledu na to, że tam funkcja AttachThreadInput jest zablokowana - względy bezpieczeństwa.

Wydaje mi się, ze chyba będzie trzeba w systemach zgodnych z NT zostawić opcję "Ctrl+C".

Jesli jednak jest jakiś program, który może to robić pod NT - podajcie nazwę, ewentualnie jakieś namiary (choćby na triala). Przyjrzę się jak to robi i może coś się jeszcze wymyśli.


_____________________________________________
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

05-08-2004 15:00
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
Wszystkich odpowiedzi: 8 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1