 |
www.winapi.org Forum strony www.winapi.org
|
| Zobacz poprzedni temat :: Zobacz następny temat |
| Autor |
Wiadomość |
walacik
Dołączył: 01 Lip 2008 Posty: 1
|
Wysłany: Wto Lip 01, 2008 9:27 pm Temat postu: Naciskanie klawisza w danym programie |
|
|
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  |
|
| Powrót do góry |
|
 |
DR460N

Dołączył: 08 Lip 2006 Posty: 5 Skąd: Warszawa
|
|
| Powrót do góry |
|
 |
Banias
Dołączył: 10 Cze 2008 Posty: 3
|
Wysłany: Czw Sie 21, 2008 1:15 pm Temat postu: |
|
|
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 |
|
 |
vParam
Dołączył: 01 Cze 2006 Posty: 192 Skąd: Raczej nie stąd ;d
|
Wysłany: Czw Sie 21, 2008 6:17 pm Temat postu: |
|
|
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 |
|
 |
Kaszanka
Dołączył: 19 Mar 2010 Posty: 4
|
Wysłany: Czw Lip 22, 2010 1:19 am Temat postu: |
|
|
Wybaczcie, że odswierzam ale po co nowy temat zakladac
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 |
|
 |
Raptor
Dołączył: 07 Lip 2007 Posty: 218
|
Wysłany: Czw Lip 22, 2010 7:41 pm Temat postu: |
|
|
nie WK tylko...
WM_KEYDOWN i WM_KEYUP. |
|
| Powrót do góry |
|
 |
Kaszanka
Dołączył: 19 Mar 2010 Posty: 4
|
Wysłany: Czw Lip 22, 2010 11:01 pm Temat postu: |
|
|
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 |
|
 |
Shadow
Dołączył: 23 Lut 2009 Posty: 133
|
Wysłany: Pią Lip 23, 2010 12:26 pm Temat postu: |
|
|
| Widocznie twórca gry zabezpieczył się przed takimi "sprytnymi" graczami jak ty. |
|
| Powrót do góry |
|
 |
Shadow
Dołączył: 23 Lut 2009 Posty: 133
|
Wysłany: Pią Lip 23, 2010 12:29 pm Temat postu: |
|
|
| 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 |
|
 |
Kaszanka
Dołączył: 19 Mar 2010 Posty: 4
|
Wysłany: Pią Lip 23, 2010 6:35 pm Temat postu: |
|
|
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 |
|
 |
Raptor
Dołączył: 07 Lip 2007 Posty: 218
|
Wysłany: Sob Lip 24, 2010 6:02 pm Temat postu: |
|
|
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 |
|
 |
Shadow
Dołączył: 23 Lut 2009 Posty: 133
|
Wysłany: Sob Lip 24, 2010 11:43 pm Temat postu: |
|
|
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)  |
|
| Powrót do góry |
|
 |
Kaszanka
Dołączył: 19 Mar 2010 Posty: 4
|
Wysłany: Wto Lip 27, 2010 5:22 pm Temat postu: |
|
|
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 |
|
 |
Raptor
Dołączył: 07 Lip 2007 Posty: 218
|
Wysłany: Wto Lip 27, 2010 9:14 pm Temat postu: |
|
|
| 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 |
|
 |
|
|
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
|