Skocz do zawartości

[C++ Builder] Hotkeysy globalne


Gazunio

Polecane posty

Witam. Mam problem z obsługą globalnych hotkeysów. Chodzi mi o to, by działały one, gdy włączona jest gra z DirectX, więc takie w WinAPI odpadają. Ja edytując kod keyloggera utworzyłem hotkeysy:

   //---------------------------------------------------------------------------

   #include <vcl.h>
   #pragma hdrstop

   #include "Unitaa1.h"
   #include <stdio.h>
   //---------------------------------------------------------------------------
   #pragma package(smart_init)
   #pragma resource "*.dfm"
   TForm1 *Form1;

   HHOOK g_hLogHook       = NULL;
   HWND g_hLastFocus      = NULL;
   const int KeyPressMask = 0x80000000;
   //---------------------------------------------------------------------------
   HOOKPROC ConnectHook(int iCode, WPARAM wParam, LPARAM lParam)
   {
   if(iCode < 0) return (HOOKPROC)CallNextHookEx(g_hLogHook, iCode, wParam, lParam);

   EVENTMSG *pEvt = (EVENTMSG *)lParam;


   if(pEvt->message == WM_KEYDOWN)
   {
     int vKey = LOBYTE(pEvt->paramL);
     char ch;
     char str[10];


     int iShift   = GetKeyState(VK_SHIFT);
     int iAlt     = GetKeyState(VK_MENU);
     int iControl = GetKeyState(VK_CONTROL);

     bool bShift   = (iShift & KeyPressMask) == KeyPressMask;
     bool bAlt     = (iAlt & KeyPressMask) == KeyPressMask;;
     bool bControl = (iControl & KeyPressMask) == KeyPressMask;



      if(bShift && bAlt && bControl && vKey == 81)
      {
       Application->Restore();
       ShowWindow(Application->Handle, SW_SHOW);
      }
     }

     return (HOOKPROC)CallNextHookEx (g_hLogHook, iCode, wParam, lParam);
   }
   //---------------------------------------------------------------------------
   __fastcall TForm1::TForm1(TComponent* Owner)
           : TForm(Owner)
   {
   }
   //---------------------------------------------------------------------------
   void __fastcall TForm1::FormCreate(TObject *Sender)
   {
   if(g_hLogHook == NULL)
   {
     g_hLogHook = SetWindowsHookEx(WH_JOURNALRECORD, (HOOKPROC)ConnectHook, HInstance,0);
     ShowMessage("Hak podłączony");
   }
   else
   {
     UnhookWindowsHookEx(g_hLogHook);
     g_hLogHook = NULL;
     ShowMessage("Hak nie został podłączony");
   }         
   }
   //---------------------------------------------------------------------------

   void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
   {
   if(g_hLogHook != NULL)
   {
     UnhookWindowsHookEx(g_hLogHook);
     g_hLogHook = NULL;
   }
   }
   //---------------------------------------------------------------------------

Ten kod działa na systemie Windows XP, ale na Viscie już nie - bo jest to hak systemowy. Czy da się to jakoś obejść, by hotkeysy działały pod Directx, na systemach XP, Vista i 7.

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...