• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Użycie (klikanie) dowolnego klawisza na aktywnym oknie.

Object Storage Arubacloud
0 głosów
1,122 wizyt
pytanie zadane 3 października 2015 w C i C++ przez juriiw Gaduła (3,470 p.)

Witam!

Tworzę program (w Borland C++ builder), który po określonym interwale czasowym, "kliknie" wybrany klawisz, np: F12 na aktualnie aktywnym oknie, znajdującym się na pulpicie (nie zminimalizowanym). Wszystko mam już gotowe tylko nie bardzo wychodzi mi odszukanie aktywnego okna oraz zasymulowanie kliknięcia klawisza F12. Szukałem na różnych stronach i jest tego sporo...ale jakoś mi nie działa. Próbowałem używać funkcji znalezionej na stronie msdn. Wyglądało to mniej więcej tak:

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  // ...jakieś instrukcje...
  //... 
   HWND hWnd;
   hWnd = FindWindow(NULL, NULL);
    SendMessage( hWnd, 0x7B, 0, 0 );
}

Kod 0x7B to właśnie F12, próbowałem też używać VK_F12. W funkcji FindWindow, w drugim argumencie wpisywałem również nazwę okna w cudzysłowiu. Nie dało to żadnego efektu.

Próbowałem też innej funkcji:

SendMessage(GetForegroundWindow(), VK_F12, 0 ,0);

Niestety bez rezultatu.

Proszę o pomoc.

2 odpowiedzi

+2 głosów
odpowiedź 5 października 2015 przez juriiw Gaduła (3,470 p.)
 
Najlepsza

Odpowiadam na swój post ponieważ rozwiązałem sam problem z tymi uchwytami. :] Sporo szukałem ale większość metod na jakie trafiłem nie działały wogóle lub niedokładnie tak jak chcialem. Poniżej przedstawiam fragment kodu, który działa na Borland Builder C++ doskonale.

{
HWND hWnd, uchwyt2;   //zmienne przechowujące uchwyt
}

//----------------w jakims tajmerze umieszczamy ten oto zestaw instrukcji:  ------------------

void __fastcall TForm1::Timer2Timer(TObject *Sender)
{ 
  hWnd = WindowFromPoint(Mouse->CursorPos);
  char *Buf = "";
  int l = GetWindowTextLength(hWnd) + 1;
  GetWindowText(hWnd, Buf, l);
  Label2->Caption = (String)Buf;     // w obiekcie Label wyświetlam nazwę przechwyconego okna
  char* x = Buf;
  uchwyt2 = FindWindow( 0, x );
  if(!uchwyt2)
    Label2->Caption = "nie wybrane";
  else
  {
    SetForegroundWindow( uchwyt2 );
  }
}

//------------- Imitowanie wciśniętego klawisz w oknie "na wierzchu" --------------
INPUT ip;
      ip.type = INPUT_KEYBOARD;
      ip.ki.wScan = 0; 
      ip.ki.time = 0;
      ip.ki.dwExtraInfo = 0;

      // Wciskanie wirtualnego klawisza
      ip.ki.wVk = zrobVK(wybor); //zmienna "wybór" przechowuje u mnie wybór w comboboxie wirtualnego klawisza, np F12.
                                                      //funkcja "zrobVK" zwraca int-a w postaci szesnastkowej: 0x7B
      ip.ki.dwFlags = 0;  
      SendInput(1, &ip, sizeof(INPUT));

      // Zwalnianie wirtualnego klawisza
      ip.ki.dwFlags = KEYEVENTF_KEYUP; 
      SendInput(1, &ip, sizeof(INPUT));

 

W efekcie końcowym wystarczy, że najadę kurosrem na okno dowolnej aplikacji i program automatycznie przechwytuje nazwę okna oraz ustawia to okno na wierzch, po czym "naciska wirtualny klawisz" na owym oknie.

komentarz 5 października 2015 przez draghan VIP (106,230 p.)

Cieszę się, że udało Ci się z tym dojść do ładu samodzielnie i podzieliłeś się rozwiązaniem. :) yes

0 głosów
odpowiedź 3 października 2015 przez draghan VIP (106,230 p.)
Najpierw sprawdź, czy na własnym oknie (nie na znalezionym "cudzym") Twoja funkcja SendMessage rzeczywiście symuluje wciśnięcie F12.

Potem można się pobawić w wysyłanie komunikatów do innych okien.
komentarz 3 października 2015 przez juriiw Gaduła (3,470 p.)

...kurcze, nie bardzo wiem jak się dotego zabrać. Czy dobrze będzie jeśli użyję funkcji, np. na evencie OnClick jakiegoś buttona.

}   
  HWND hWnd;
  hWnd = FindWindow(NULL, "Nazwa Okna Programu");
  SendMessage( hWnd, 0x7B, 0, 0 );
}

Następnie na głównej Formie, zdarzeniu OnActivare stworzyć jakiś warunek dla tego 0x7B lub VK_F12? Proszę o pomysły lub pomoc z kodem.

komentarz 3 października 2015 przez draghan VIP (106,230 p.)
Czy interfejs C++Buildera nie przewiduje udostępnienia uchwytu utworzonego okna? Bo zakładam, że próbujesz coś zdziałać z C++Builderem, nie mylę się?
komentarz 3 października 2015 przez juriiw Gaduła (3,470 p.)
Tak jak napisalem w pierwszym poście. Próbuję stworzyć mója aplikację w Borland Builderze.
komentarz 3 października 2015 przez draghan VIP (106,230 p.)
Wybacz, mój błąd.  W ogóle pomyliłem wątki! -.)

Tak, Twój sposób wydaje się być okej. :) Próbowałeś już wdrożyć takie rozwiązanie? :)
komentarz 3 października 2015 przez juriiw Gaduła (3,470 p.)
Jeszcze nie, szukam więcej informacji, ponieważ nigdy nie korzystałem z uchwytów. Nie wiem zabardzo z czym to się konsumuje.

W takim razie proszę o pomoc w sprawie mojego konkretnego problemu.
komentarz 3 października 2015 przez draghan VIP (106,230 p.)

Uchwyt to taki bajer, wprowadzony* w WinAPI - czyli API programistycznym do pisania okienek w Windows. :)

WinAPI nie jest obiektowe, było pisane w czystym C - nie istnieje w nim pojęcie obiektu - ale przecież użytkownik musi w nim tworzyć pewne obiekty, jedne zależne od innych.
Żeby to było możliwe, na programistę zrzuca się obowiązek pilnowania porządku, poprzez udostępnienie mu uchwytów (czyli wszelkiego rodzaju H*, jak HWND czy HPROC [H jak handle, czyli uchwyt]).

Po prostu mówiąc, uchwyt to jest identyfikator. Jeśli kazałeś sobie stworzyć okno, to funkcja je tworząca daje Ci w prezencie uchwyt, żebyś mógł cokolwiek dalej z tym oknem zrobić, jak np. wysłać do niego komunikat o zamknięciu czy zmianie rozmiaru. Tak samo jest z czymkolwiek innym, co tworzysz przy użyciu WinAPI. Zawsze dostajesz od funkcji tworzącej uchwyt - bo jak inaczej miałbyś operować na takim utworzonym zasobie? :)


*- no dobra, nie wiem czy nie był wprowadzony gdzieś wcześniej - a sądzę że był. Po prostu w WinAPI jest szeroko wykorzystywany, dla mnie to sztandarowy przykład modelu używającego uchwytów.

Podobne pytania

+1 głos
1 odpowiedź 92 wizyt
pytanie zadane 12 marca 2022 w JavaScript przez Grzegorz Mikina Dyskutant (8,060 p.)
0 głosów
1 odpowiedź 873 wizyt
+1 głos
2 odpowiedzi 365 wizyt

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...