Podmiana klawiszy, pętla

0

Mój problem z punktu logicznego jest prosty. Gdy, wcisnę klawisz "A", wtedy komputer wystukuje w pętli : "B", przerwa, "C", przerwa.
Jednak gdy chodzi o programowanie, to czarna magia. Ja pisze tu po to, by ktoś w możliwie najprostszy sposób wytłumaczył mi jak to zrobić. Gotowcem oczywiście nie pogardzę, jednak chodzi mi o mechanizm działania.

0

Zacznij od kursu dowiesz się na pewno z niego jak wypisać coś na konsolę i jak "wstrzymać" wykonywanie kodu.

1
MEDI napisał(a)

Mój problem z punktu logicznego jest prosty. Gdy, wcisnę klawisz "A", wtedy komputer wystukuje w pętli : "B", przerwa, "C", przerwa.

To jest właśnie mechanizm, wystarczy przyporządkować kolejnym krokom odpowiednie instrukcje; Nie postarałeś się z opisem, bo z tego co podałeś wynika, że chcesz reagować jedynie na wciśnięcie klawisza A;

MEDI napisał(a)

Gotowcem oczywiście nie pogardzę, jednak chodzi mi o mechanizm działania.

Proszę bardzo:

var
  chrKey: Char;
begin
  chrKey := UpCase(ReadKey);

  if chrKey = 'A' then
    Write('B C ');
MEDI napisał(a)

Jednak gdy chodzi o programowanie, to czarna magia.

Więc szoruj do nauki i wróć tutaj, jeśli nauczysz się chociaż podstaw programowania.

0

Program działa, jednak tylko wewnątrz aplikacji, a chodzi mi o to by działał na zewnątrz. Czyli, podczas rozmowy na gg gdy, wcisnę "[" program napisze do koleżanki "Bu ha ha!". Wydaję mi się, że nie tędy droga.

program logical;
uses crt;
var
  chrKey: Char;
  a: integer;

  procedure pentlaskey;
  begin
   chrKey := UpCase(ReadKey);
  if chrKey = 'A' {or 'a'} then
    Write('B C ');
  if chrKey = 'Q' {or 'q'} then
	exit;
  if chrKey = 'Z' then
	write('A');
	delay(200);
	write(' ');
	delay(200);
	write('B');
	delay(200);
	write(' ');
	delay(200); 
  end; 
  
BEGIN
a:=0;
repeat
pentlaskey;
//a:=a+1;
until (a=5);
END. 
0

Musisz założyć hooka, żeby Twój program działający w tle dostał informację jaki klawisz został wciśnięty.
Teraz masz dwie możliwości albo:
Odszukać uchwyt kontrolki która ma fokusa i tam wysłał teks.
albo:
możesz zasymulować wciśnięcie klawiszy które Ci taki tekst utworzą.

0

Usiłując uruchomić kilka gotowców z neta, kląć przy tym do monitora stwierdzam: używam za starych programów albo źle zainstalowanych. Ręce w górę opadają, nic się nie kompiluje.
Mam pytanie, wszystkie języki programowania są takie trudne, czy mam za mało cierpliwości?

0

@MEDI po prostu źle podchodzisz do sprawy. Próba sklejania i uruchamiania "gotowców" z neta to najgorszy możliwy sposób "nauki" programowania.
To trochę tak jakbyś przeczytał artykuł "jakie powinienem mieć tempo na kolejnych kilometrach maratonu żeby złamać 2,5h" a potem dziwił się że nic ci z tego nie wychodzi bo masz zadyszkę po 1 kilometrze, a po 2 bolą cię kolana.

0

@MEDI: Akurat Obiektowy Pascal jest na prawdę prosty na start. Trzeba tylko poczytać kurs z podstawami, zaglądać na MSDN i myśleć co się robi. Symulowanie klawiszy można zrobić za pomocą takiej funkcji korzystającej z WinAPI (potrzebny jest moduł Windows w sekcji uses).

procedure KeyDownUp(KeyToSend : Byte; KeyDown : boolean);
const
  DownUp_Flags_Arr : array[boolean] of DWORD = (0, KEYEVENTF_KEYUP);
  Extended_Flags_Arr : array[boolean] of DWORD = (0, KEYEVENTF_EXTENDEDKEY);
var
  Input : TagINPUT;
  KeyExtended : boolean;
begin
  Input.Itype := INPUT_KEYBOARD;
  Input.ki.wVK := KeyToSend;
  Input.ki.wScan := MapVirtualKey(KeyToSend, 0);
  KeyExtended := KeyToSend in
    [VK_CONTROL, VK_LCONTROL, VK_RCONTROL,
    VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT,
    VK_HOME, VK_END, VK_PRIOR, VK_NEXT,
    VK_INSERT, VK_DELETE, VK_MENU];
  Input.ki.dwFlags := DownUp_Flags_Arr[not KeyDown] or Extended_Flags_Arr[KeyExtended];
  Input.ki.time := 0;
  SendInput(1, Input, SizeOf(Input));
end;

Lista kodów klawiszy jest na: http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx - jednak do okna GG można spróbować wyslać komunikat WM_CHAR z żądanymi znakami. Poczytaj na ten temat na google. Tylko co do tego czy okno GG akceptuje komunikaty WM_CHAR czyli, czy jest to standardowa kontrolka edycyjna - tego nie wiem. Ponieważ od dawna porzuciłem GG i używam tylko AQQ. A tam można sobie wiele rzeczy ogarnąć korzystając z gotowych lub napisanych przez siebie pluginów. W sieci jest dokumentacja i API pod Delphi.

Poczytaj też jeszcze wątek na: http://stackoverflow.com/questions/15853732/sending-keystroke-to-another-application-using-winapi jest tam przykład jak można spróbowac ustalić uchwyt okna, do którego ślemy komunikat WM_CHAR. Inne funkcje ktore mogą pomóc to FindWindow, EnumChildWindows, EnumWindows czy GetWindow. Na google jest mnóstwo przykładów ich użycia, również w Delphi. Nic, tylko poszukać i kombinowac, ale z głową.

Jeśli chodzi jednak aby reakcja na klawisz była globalna to są dwie skuteczne metody jakie znam. Własna obsługa funkcji RegisterHotKey i obsługa komunikatu WM_HOTKEY w swojej aplikacji. Normalnie WM_HOTKEY działa lokalnie, ale dzięki dołaczonym modułom hotkeyhandler2.pas i hotkeyhandler2_ver2.pas do tego posta można to robić globalnie. Wersja druga różni się od tej bez dopisku, tym, że po naciśnięciu klawisza oczekiwane jest jego puszczenie i dopiero wtedy reagujemy na inny. Kod został w oryginale zapożyczony z programu Cheat Engine i dostosowany do działania w czystym WinAPI, bo na tym mi zależało. Ważne jest tylko aby wywołanie funkcji RegisterHotKey poprzedzić nazwą któgoś z tych modułów, bo normalnie funkcja bez udogodnień siedzi w module Windows. Inny sposób to zadeklarować te moduły do hotkeyów po module Windows w sekcji uses.

A i publikuje tutaj po raz kolejny nieco poprawiony do działania też w XP mój mały program, ktory wraz z kodem i exekiem umieściłem w archiwum press_v_xp.rar. Działa on tak, że zamienia jakby miejscami klawisze "~" i "v". Działa identycznie jak kod klawisz:innyklawisz pod AutoHotKey, ale exek jest o wiele mniejszy, a kod mój. Napisałem sobie kiedyś coś takiego aby na starej klawiaturze zamienić sobie klawisz, który się zacinal :) I tak się już przyzwyczaiłęm, że korzystam z tego nawet na nowej klawiaturze. Z kodu tego dowiesz się jak można obsłużyć globalny Hook na klawisze. Jednak program do działania potrzebuje praw Admina, które wymusza po uruchomieniu jeśli mamy właczone UAC. Dwuklikiem na ikonce można wyłączyć Hooka (będzie ona wtedy w kolorze czerwonym).

Dostałeś sporą ilość materiału do przerobienia. Teraz tylo z głową rusz do ogarnięcia problemu po swojemu. Pamiętaj, programowanie to nie zgadywanka, trzeba myśleć co się robi. A w pisaniu pomagają przykłady opublikowane w necie i dokumentacja na MSDNie lub help środowiska, w którym piszemy. Dodatkowo należy przeczytać komendium Delphi na 4p, bo bez elementarnych podstaw nic nie zdziałasz. Ode mnie masz na zachęte sporą "garść" informacji, kodów i linków, które powinny być wystarczające do napisania tego, co sobie zapranąłeś. Powodzenia i sorry za rozpisanie się.

1 użytkowników online, w tym zalogowanych: 0, gości: 1