Forum www.winapi.org Strona Główna www.winapi.org
Forum strony www.winapi.org
 
 FAQFAQ   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 
Naciskanie klawisza w danym programie

 
Napisz nowy temat   Odpowiedz do tematu    Forum www.winapi.org Strona Główna -> Programowanie Windows
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
walacik



Dołączył: 01 Lip 2008
Posty: 1

PostWysłany: Wto Lip 01, 2008 9:27 pm    Temat postu: Naciskanie klawisza w danym programie Odpowiedz z cytatem

Potrzebuje napisac prosty programik naciskajacy dany (podany w kodzie nie wybierany) klawisz w danej aplikacji nawet gdy aplikacja jest zminimalizowana
np:
1. odpalam worda (lub inna wybrana aplikacje)
2. odpalam ten programik ktory np naciska non stop klawisz "enter" w petli np 9999 razy
i teraz problem:
3.nawet jak zminimalizuje worda to chce zeby on nadal naciskal ten enter tylko i wylacznie w wordzie a nie w czymkolwiek co zalacze

czyli musi ten moj programik byc przypisany tylko i wylacznie do 1 aplikacji (jej procesu) i tylko w niej dzialac nawet jak jest zminimalizowana

mam nadzieje ze komus sie uda cos wymyslic z moim problemem Smile
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
DR460N



Dołączył: 08 Lip 2006
Posty: 5
Skąd: Warszawa

PostWysłany: Sro Lip 02, 2008 11:32 am    Temat postu: Odpowiedz z cytatem

Poczytaj o funkcji SendMessage() na MSDN (http://msdn.microsoft.com/en-us/library/aa931932.aspx) Smile
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Banias



Dołączył: 10 Cze 2008
Posty: 3

PostWysłany: Czw Sie 21, 2008 1:15 pm    Temat postu: Odpowiedz z cytatem

Co powinno być w parametrze lParam dla wydarzeń WM_KEYDOWN i WM_KEYUP, tak, żeby okno o danym uchwycie zachowało się tak, jakby to użytkownik fizycznie kliknął dany przycisk na klawiaturze?
Testowałem na notatniku, uchwyt pobierałem ustawiając myszkę nad polem tekstowym okna notatnika i wywołując:
Kod:
POINT pt;
HWND notatnik;
GetCursorPos(&pt);
notatnik=WindowFromPoint(pt);

Następnie próbowałem zasymulować wciśnięcie klawiszy, przez podanie liczby całkowitej, odpowiedniej dla klawisza:
Kod:

int vkey=/nr jakiegos klawisza zgodny z Virtual Keys/;
SendMessage(notatnik,WK_KEYDOWN,vkey,1);
Sleep(100);
SendMessage(notatnik,WK_KEYUP,vkey,0);

Efekt jest taki, że dla klawiszów odpowiadających charom (np. 'a', 'x', '.', backspace) symuluje podwójne naciśnięcie (na keydown i keyup), a dla innych (takich jak shift) jest dźwięk błędnego klawisza ("Domyślny sygnał dźwiękowy). Próba zasymulowania wpisania wielkiej litery "A":
Kod:

SendMessage(notatnik,WK_KEYDOWN,VK_SHIFT,1);
Sleep(100);
SendMessage(notatnik,WK_KEYDOWN,'a',1);
Sleep(100);
SendMessage(notatnik,WK_KEYUP,'a',0);
Sleep(100);
SendMessage(notatnik,WK_KEYUP,VK_SHIFT,0);

kończy się dwoma "Domyślnymi sygnałami dźwiękowymi" i wpisaniem do notatnika "aa".
Myślę, że mam zły lParam, ale nie wiem jak poprawić.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
vParam



Dołączył: 01 Cze 2006
Posty: 192
Skąd: Raczej nie stąd ;d

PostWysłany: Czw Sie 21, 2008 6:17 pm    Temat postu: Odpowiedz z cytatem

Jest wiele rozwiązań Waszego problemu:
keybd_event //(bardzo ciekawe efekty)
SetActiveWindow lub SetFocus lub SetCaret

Banias: http://msdn.microsoft.com/en-us/library/ms646280(VS.85).aspx
_________________
"To złe miejsce, zły czas, uciekaj, raz, raz,
oni mają broń, ty nagą dłoń i nic więcej..."
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Kaszanka



Dołączył: 19 Mar 2010
Posty: 4

PostWysłany: Czw Lip 22, 2010 1:19 am    Temat postu: Odpowiedz z cytatem

Wybaczcie, że odswierzam ale po co nowy temat zakladac Wink

keybd_event działa mi jak należy, tylko nie moge sobie poradzić z SetFocus lub SetActiveWindow...

oto moje kody, sprawdzane na notatniku
Kod:

#include <iostream.h>   
#include <windows.h>
 
void main()
{
   HWND hOkno;
   Sleep(2000);
   hOkno = GetForegroundWindow();
   cout << hOkno << endl;
   while(1)
   {
                  SetFocus(hOkno);
       keybd_event(0x41,0x1E, 0 , 0);   //wciska klawisz "a"
       keybd_event(0x41,0x1E, KEYEVENTF_KEYUP , 0);
       Sleep(1000);
   }
}


Ten kod działa ale tylko w oknie ktore jest aktualnie aktywne, SetFocus nic nie daje...

oto kolejny kod, z SendMessage:
Kod:

#include <iostream.h>   
#include <windows.h>
 
void main()
{
   HWND hOkno;
   Sleep(2000);
   hOkno = GetForegroundWindow();
   cout << hOkno << endl;
   Sleep(1000);
   while(1)
   {
                  SendMessage(hOkno,WK_KEYDOWN,'a',1);
                  Sleep(100);
                  SendMessage(hOkno,WK_KEYUP,'a',0);
       Sleep(1000);
   }
}


Tu wywala mi error przy kompilacji:
Kod:

Undefined symbol 'WK_KEYDOWN' in function main()
Undefined symbol 'WK_KEYUP' in function main()


Prosze o pomoc, probowalem tez z SetActiveWindow ale nie zwraca mi uchwytu okna które poprzednio bylo aktywne, zwraca mi 0, GetLastError wtedy też zwraca 0.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Raptor



Dołączył: 07 Lip 2007
Posty: 218

PostWysłany: Czw Lip 22, 2010 7:41 pm    Temat postu: Odpowiedz z cytatem

nie WK tylko...

WM_KEYDOWN i WM_KEYUP.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Kaszanka



Dołączył: 19 Mar 2010
Posty: 4

PostWysłany: Czw Lip 22, 2010 11:01 pm    Temat postu: Odpowiedz z cytatem

zmienialem na WM i nie wywala bledu przy kompilacji ale nie dziala.

Dodam ze to ma wysylac symulacje wcisniecia przycisku do gry
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Shadow



Dołączył: 23 Lut 2009
Posty: 133

PostWysłany: Pią Lip 23, 2010 12:26 pm    Temat postu: Odpowiedz z cytatem

Widocznie twórca gry zabezpieczył się przed takimi "sprytnymi" graczami jak ty.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Shadow



Dołączył: 23 Lut 2009
Posty: 133

PostWysłany: Pią Lip 23, 2010 12:29 pm    Temat postu: Odpowiedz z cytatem

Kaszanka napisał:

Kod:

#include <iostream.h>   
#include <windows.h>
 
void main()
{
   HWND hOkno;
   Sleep(2000);
   hOkno = GetForegroundWindow();
   cout << hOkno << endl;
   Sleep(1000);
   while(1)
   {
                  SendMessage(hOkno,WK_KEYDOWN,0x41,1);
                  Sleep(100);
                  SendMessage(hOkno,WK_KEYUP,0x41,0);
       Sleep(1000);
   }
}

Nawy temat zakładać po to, żeby zawartość była zgodna z tytułem.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Kaszanka



Dołączył: 19 Mar 2010
Posty: 4

PostWysłany: Pią Lip 23, 2010 6:35 pm    Temat postu: Odpowiedz z cytatem

Shadow i po co te docinki?

wg mnie zawartość jest zgodna z tematem, jak sie czegos przyczepiasz to napisz chociaż czego...
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Raptor



Dołączył: 07 Lip 2007
Posty: 218

PostWysłany: Sob Lip 24, 2010 6:02 pm    Temat postu: Odpowiedz z cytatem

Tylko że Shadow ma racje, niektóre gry (w szczególności te internetowe) sprawdzając czy przycisk jest fizycznie wciśnięty, osobiście nie znam sposobu aby to ominąć.

Sam komunikat nie starcza, nawet symulacja wciśnięcia klawisza zawodzi. Do tego komunikat musiałby być skierowany bezpośrednio do przycisku, albo do okna podając ID przycisku którego my nie znamy.

(Można sprawdzać czy klawisz myszy i/lub klawiatury jest fizycznie wciśnięty)
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Shadow



Dołączył: 23 Lut 2009
Posty: 133

PostWysłany: Sob Lip 24, 2010 11:43 pm    Temat postu: Odpowiedz z cytatem

Na rozwiązanie tego problemu masz dużo metod(programistyczna - tej już próbujesz, z lepszym lub gorszym skutkiem, mechaniczna - mechanizm uderzający w spację, biologiczna - królik na klawiaturze, itd. itp) Smile
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Kaszanka



Dołączył: 19 Mar 2010
Posty: 4

PostWysłany: Wto Lip 27, 2010 5:22 pm    Temat postu: Odpowiedz z cytatem

a tak poważnie, myslicie ze SendInput cos pomoze?

moglby ktos wyjaśnić mi przykład wciskania przycisku w okreslonym oknie za pomoca SendInput który znalazłem w necie? Jak tego uzywac?

Kod:
        INPUT Klawisz;
        Klawisz.type = INPUT_KEYBOARD;
                Klawisz.ki.wVk = VK_BACK; 
                SendInput (1, &Klawisz, sizeof(INPUT));  //wciskam beckspace
                Klawisz.ki.dwFlags = KEYEVENTF_KEYUP;
                SendInput (1, &Klawisz, sizeof(INPUT)); 
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Raptor



Dołączył: 07 Lip 2007
Posty: 218

PostWysłany: Wto Lip 27, 2010 9:14 pm    Temat postu: Odpowiedz z cytatem

Kod:
void ClickKey(char VirtualCode)
{
   INPUT click[2];
   ZeroMemory(click, sizeof(INPUT)*2);
   click[0].type = click[1].type = INPUT_KEYBOARD;
   click[0].ki.wVk = click[1].ki.wVk = static_cast<unsigned>(VirtualCode);
   click[1].ki.dwFlags = KEYEVENTF_KEYUP;

   SendInput(2, click, sizeof(INPUT));
}


Windows wysyła odpowiedni komunikat do okna które posiada focus. SendInput jest dobre, ale nadal można sprawdzić czy ktoś dotknął fizycznie klawiatury.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum www.winapi.org Strona Główna -> Programowanie Windows Wszystkie czasy w strefie CET (Europa)
Strona 1 z 1

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach


Powered by phpBB © 2001, 2005 phpBB Group