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 
Hotkey

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



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

PostWysłany: Nie Lut 21, 2010 4:22 pm    Temat postu: Hotkey Odpowiedz z cytatem

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
Zobacz profil autora Wyślij prywatną wiadomość
Shadow



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

PostWysłany: Pon Lut 22, 2010 8:13 am    Temat postu: Odpowiedz z cytatem

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
Zobacz profil autora Wyślij prywatną wiadomość
Raptor



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

PostWysłany: Pon Lut 22, 2010 9:32 am    Temat postu: Odpowiedz z cytatem

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
Zobacz profil autora Wyślij prywatną wiadomość
Shadow



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

PostWysłany: Pon Lut 22, 2010 10:05 am    Temat postu: Odpowiedz z cytatem

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 Smile.


http://darkcult.home.pl/wiki/index.php?title=Haki
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
exylum



Dołączył: 12 Wrz 2009
Posty: 111

PostWysłany: Pon Lut 22, 2010 1:42 pm    Temat postu: Odpowiedz z cytatem

http://msdn.microsoft.com/en-us/library/ms646293%28VS.85%29.aspx
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
Raptor



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

PostWysłany: Pon Lut 22, 2010 5:28 pm    Temat postu: Odpowiedz z cytatem

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
Zobacz profil autora Wyślij prywatną wiadomość
exylum



Dołączył: 12 Wrz 2009
Posty: 111

PostWysłany: Czw Lut 25, 2010 4:44 pm    Temat postu: Odpowiedz z cytatem

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
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
Raptor



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

PostWysłany: Czw Lut 25, 2010 10:37 pm    Temat postu: Odpowiedz z cytatem

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
Zobacz profil autora Wyślij prywatną wiadomość
exylum



Dołączył: 12 Wrz 2009
Posty: 111

PostWysłany: Czw Lut 25, 2010 11:31 pm    Temat postu: Odpowiedz z cytatem

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
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
Raptor



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

PostWysłany: Pią Lut 26, 2010 7:04 am    Temat postu: Odpowiedz z cytatem

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
Zobacz profil autora Wyślij prywatną wiadomość
exylum



Dołączył: 12 Wrz 2009
Posty: 111

PostWysłany: Pią Lut 26, 2010 5:27 pm    Temat postu: Odpowiedz z cytatem

Taki szybki timer jest praktycznie niezauważalny jeśli chodzi o wymagania.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
Raptor



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

PostWysłany: Pią Lut 26, 2010 8:05 pm    Temat postu: Odpowiedz z cytatem

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
Zobacz profil autora Wyślij prywatną wiadomość
Gazunio



Dołączył: 25 Kwi 2010
Posty: 1

PostWysłany: Nie Kwi 25, 2010 5:26 pm    Temat postu: Odpowiedz z cytatem

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
Zobacz profil autora Wyślij prywatną wiadomość
exylum



Dołączył: 12 Wrz 2009
Posty: 111

PostWysłany: Nie Kwi 25, 2010 6:07 pm    Temat postu: Odpowiedz z cytatem

GetAsyncKeyState działa z grami pod directx.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
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