| Zobacz poprzedni temat :: Zobacz następny temat |
| Autor |
Wiadomość |
Raptor
Dołączył: 07 Lip 2007 Posty: 218
|
Wysłany: Nie Lut 21, 2010 4:22 pm Temat postu: Hotkey |
|
|
Witam, próbowałem napisać aplikacje która mogła by podjąć działanie gdy w dowolnym oknie systemu wcisnę kombinacje klawiszy. Niby się udało z drobnym wyjątkiem na którym mi bardzo zależy. Gdy mam włączoną pewną grę to wciskając te klawisze niestety nie ma efektu. Myślałem na początku że istnieje jakiś konflikt pomiędzy skrótami klawiszowymi, ale dobrałem takie których aplikacja nie wykorzystuje i nadal efektu brak.
W innych przypadkach mój programik działa idealnie, tylko w tym jednym są problemy. W czym może tkwić problem, czy ta gra blokuje gorące klawisze?
| Kod: | #define HOTKEY_MOD (MOD_ALT | MOD_CONTROL)
void Error(int, const char*); // Wyświetla komunikat i zamyka program
std::vector<ATOM> hkAtomList;
HWND hOkno; // Główne okno mojego programu |
| Kod: | void RegisterHotHeys()
{
hkAtomList.resize(2, 0);
try {
for (short i = 0; i < 2; ++i)
{
std::stringstream sStream;
sStream << "PM_Atom_Id_" << i;
hkAtomList[i] = GlobalAddAtom(sStream.str().c_str());
if (hkAtomList[i] == NULL)
throw 1;
}
if (RegisterHotKey(hOkno, hkAtomList[0], HOTKEY_MOD, 'Q') == FALSE ||
RegisterHotKey(hOkno, hkAtomList[1], HOTKEY_MOD, 'E') == FALSE)
throw 2;
} catch (int err)
{
Error(err, "RegisterHotHeys()");
}
}
void UnRegisterHotHeys()
{
UnregisterHotKey(hOkno, hkAtomList[0]);
UnregisterHotKey(hOkno, hkAtomList[1]);
while (hkAtomList.size() > 0u)
{
GlobalDeleteAtom(hkAtomList.back());
hkAtomList.pop_back();
}
} |
|
|
| Powrót do góry |
|
 |
Shadow
Dołączył: 23 Lut 2009 Posty: 134
|
Wysłany: Pon Lut 22, 2010 8:13 am Temat postu: |
|
|
| Może gra przechwytuje globalne klawisze? PS. jeśli programujesz w winapi to polecam zapoznać się z c#. Pracuje się tam 5x szybciej. |
|
| Powrót do góry |
|
 |
Raptor
Dołączył: 07 Lip 2007 Posty: 218
|
Wysłany: Pon Lut 22, 2010 9:32 am Temat postu: |
|
|
Czy można by ominąć jakbym założył globalnego haka na klawiaturę i samemu obsłużył gorące klawisze? Pytam się bo jeszcze haków nie zakładałem i musiałbym o nich poczytać zanim przystąpię do działania.
Jeśli chodzi o C# to mam parę pytanek:
1. Masz może stronkę z jakimś dobrym kursem?
2. Skoro mam VC++ 2008 to muszę ściągnąć nowy programik VC# 2008?
3. Ten język jest uniwersalny tzn. zadziała też w linuxie? (o to pytam z czystej ciekawości) |
|
| Powrót do góry |
|
 |
Shadow
Dołączył: 23 Lut 2009 Posty: 134
|
Wysłany: Pon Lut 22, 2010 10:05 am Temat postu: |
|
|
Hmm, nie działa na linuksie(ale winapi też nie, co?), musisz ściągać VS2k8.
Kursów dobrych nie znam, składnia jest bardzo podobna do c++, ew. można poczytać ten z polskiej strony microsoftu.
Myślę, że hak rozwiązał by sprawę(ale poczytaj o nich więcej):
| Cytat: |
Haki (ang. hooks) to takie miejsca w mechanizmie komunikatów, w których możemy "podstawić" własną procedurę, przechwytującą te komunikaty, zanim dotrą one do swojej docelowej procedury okna. Owa "własna procedura" może sama podejmować decyzję, co z takim komunikatem zrobić. Przede wszystkim - może go przesłać dalej (do docelowej procedury okna) lub też unicestwić. Może również wyciągać różne informacje z komunikatu i wykorzystywać ich do własnych, cnych lub niecnych, celów . |
http://darkcult.home.pl/wiki/index.php?title=Haki |
|
| Powrót do góry |
|
 |
exylum

Dołączył: 12 Wrz 2009 Posty: 111
|
|
| Powrót do góry |
|
 |
Raptor
Dołączył: 07 Lip 2007 Posty: 218
|
Wysłany: Pon Lut 22, 2010 5:28 pm Temat postu: |
|
|
Wiem co to Haki, tylko nie znam ich możliwości. I pytanie brzmi czy ominą ten problem.
Funkcja GetAsyncKeyState załatwi sprawę, ale trzeba będzie dołączyć timer albo wątek. Istnieje jeszcze jakiś inne rozwiązanie? |
|
| Powrót do góry |
|
 |
exylum

Dołączył: 12 Wrz 2009 Posty: 111
|
Wysłany: Czw Lut 25, 2010 4:44 pm Temat postu: |
|
|
Wszystko zależy od gry. Są różne mechanizmy radzące sobie z przechwytywaniem klawiszy, szczególnie w grach (przechwytywanie haseł, boty). Nawet z hakami gry sobie radzą, zakładając swoje haki - przechwytują klawisze i skramblują przed przesłaniem dalej. Wtedy Twój hak dostaje krzaki.
Ergo: musisz sprawdzić. |
|
| Powrót do góry |
|
 |
Raptor
Dołączył: 07 Lip 2007 Posty: 218
|
Wysłany: Czw Lut 25, 2010 10:37 pm Temat postu: |
|
|
To gra typu online więc z góry zakładam że ma te wszystkie zabezpieczenia. A wszystko co ja chce zrobić to włączyć/wyłączyć muzykę bez potrzeby minimalizowania aplikacji.
Więcej pomysłów nie mam zrobię to z pomocą GetAsyncKeyState czekanie kilku sekund aż timer zadziała będzie znacznie wygodniejsze od minimalizacji programu. |
|
| Powrót do góry |
|
 |
exylum

Dołączył: 12 Wrz 2009 Posty: 111
|
Wysłany: Czw Lut 25, 2010 11:31 pm Temat postu: |
|
|
| Kilku sekund? Jak pisałem trainery do gier, to przy timerze który miał chyba 100ms interwał, efekt był natychmiastowy. |
|
| Powrót do góry |
|
 |
Raptor
Dołączył: 07 Lip 2007 Posty: 218
|
Wysłany: Pią Lut 26, 2010 7:04 am Temat postu: |
|
|
Wiem że mogę ustawić timer na kilka ms, ale mój komputer jest nadzwyczaj powolny więc timer ustawiony jest tak aby komputer nie miał za dużo do roboty.
Może trochę przesadzam, ale to mi wystarczy. Dzięki za odpowiedź. |
|
| Powrót do góry |
|
 |
exylum

Dołączył: 12 Wrz 2009 Posty: 111
|
Wysłany: Pią Lut 26, 2010 5:27 pm Temat postu: |
|
|
| Taki szybki timer jest praktycznie niezauważalny jeśli chodzi o wymagania. |
|
| Powrót do góry |
|
 |
Raptor
Dołączył: 07 Lip 2007 Posty: 218
|
Wysłany: Pią Lut 26, 2010 8:05 pm Temat postu: |
|
|
Dzięki za troskę, ale timer i tak będzie ustawiony na kilka sekund. W tym wypadku można powiedzieć że jest mi to na rękę.
@EDIT
Obecnie jest to zrobione tak że rejestruje gorące klawisze. Gdy jest to możliwe zadziałają natychmiastowo i zablokują na kilka sekund możliwość aktywowania tych klawiszy przez timer. Gdy jest ów gra blokuje hotkey wystarczy przytrzymać kombinacje 2 klawiszy przez kilka sekund. Do moich zastosować można powiedzieć że jest to idealne. |
|
| Powrót do góry |
|
 |
Gazunio
Dołączył: 25 Kwi 2010 Posty: 1
|
Wysłany: Nie Kwi 25, 2010 5:26 pm Temat postu: |
|
|
| Ja również próbuję rozwiązać kwestię globalnych hotkesyów, lecz zbytnio nie wiem jak to wykonać. Chodzi o to, by działały w grze opartej na DirectX, więc te "zwykłe" hotkeysy odpadają. Mam kod, dzięki któremu działają w grze na systemie Win XP, ale na Viscie haki nie działają, mimo uprawnień administratora nadanych w manifeście. Ma ktoś jakiś pomysł? |
|
| Powrót do góry |
|
 |
exylum

Dołączył: 12 Wrz 2009 Posty: 111
|
Wysłany: Nie Kwi 25, 2010 6:07 pm Temat postu: |
|
|
| GetAsyncKeyState działa z grami pod directx. |
|
| Powrót do góry |
|
 |
|