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

VPS Starter Arubacloud
0 głosów
1,100 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ź 86 wizyt
pytanie zadane 12 marca 2022 w JavaScript przez Grzegorz Mikina Dyskutant (8,060 p.)
0 głosów
1 odpowiedź 865 wizyt
+1 głos
2 odpowiedzi 362 wizyt

92,452 zapytań

141,262 odpowiedzi

319,077 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...