webForumDet fria alternativet

"fake tangentbordstryckingar"

Programmering

10 svar · 410 visningar · startad av Alpha II

Medlem sedan maj 20002 993 inlägg
Frågan#1

Hur kan jag göra så att datorn tror att vissa tangenter(bokstäver) trycks ner?

Medlem sedan maj 20021 466 inlägg
#2

Varför? Ofta finns det betydligt bättre sätt att styra program från andra program, än att gå via användargränsnittet.

Du använder Windows API-funktionerna keybd_event eller SendInput. SendInput finns endast till Windows 98 och Windows NT 4 SP3 och senare.

Exempel för C finns i dokumentationen för keybd_event. Porta till Pascal och använd.

   #include <windows.h>

   void SetNumLock( BOOL bState )
   {
      BYTE keyState[256];

      GetKeyboardState((LPBYTE)&keyState);
      if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||
          (!bState && (keyState[VK_NUMLOCK] & 1)) )
      {
      // Simulate a key press
         keybd_event( VK_NUMLOCK,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );

      // Simulate a key release
         keybd_event( VK_NUMLOCK,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
      }
   }

   void main()
   {
      SetNumLock( TRUE );
   }
Medlem sedan juli 200012 978 inlägg
#3

Sök på Sendkey
Exempelvis här http://www.geocities.com/SiliconValley/Vista/2964/applications.html

Medlem sedan maj 20002 993 inlägg
#4

Brukar spela ett spel där man ibland måste säga en sak många gånger i chaten och det finns ingen kopiera klistar in funktion så jag tänkte att jag skulle göra ett program för att göra det enklare (jag är lat). Nu är det klart och det verkar funka bra.

Finns det nått annat sätt man skulle kunna göra det på?

Medlem sedan juni 2000350 inlägg
#5

Kan du få tag i rätt fönster handle så borde exemplet nedan fungera. Exemplet skickar text till notepad.

var
S: string;
wnd: Hwnd;
i: integer;
begin
wnd := FindWindow( 'notepad', Nil );
wnd := GetWindow( wnd, GW_CHILD );
s := 'AAAA';
SendMEssage( wnd, WM_SETTEXT, 0, longint( PChar( S )));
s := 'BBBB';
for i:= 1 to length(S) do
SendMessage( wnd, WM_CHAR, Ord(S*), 0 );
end;*

Medlem sedan maj 20002 993 inlägg
#6

har hittat det där exemplet också... bytte ut notepad till titeln som spelet har men det fungerade inte :( Kan det bero på att fönstret inte är själva spelet utan bara öppnar en sida med spelet som ett applet?

Medlem sedan maj 20021 466 inlägg
#7

Det kan bero på flera saker. Det kan också bero på att fönstret vill ha WM_KEYDOWN istället.

Använder du keybd_event skickas rätt meddelanden till det aktiva fönstret.

Medlem sedan juni 2000350 inlägg
#8

Det kan vara lite lurigt att på ett enkelt sätt få tag i rätt handle. Kanske kan du få lite hjälp genom att testa detta program http://www.greatis.com/windowse.htm.
Första parametern i findwindow är inte titeln på fönstret utan klassnamnet.

Medlem sedan maj 20002 993 inlägg
#9

Kan klassen verkligen heta "Afx:400000:b:10011:340185"??? Det ändras när man startar om spelet också..... Detr fungerar fö. inte heller... :(

Medlem sedan maj 20021 466 inlägg
#10

Alpha II skrev:

Kan klassen verkligen heta "Afx:400000:b:10011:340185"???

Jodå, det kan heta vad som helst. Det viktiga i det här fallet är att klass-namnet ändras varje gång och därför kan du inte söka efter det.

Du kan bl.a. låta användaren själv aktivera programmet som ska styras och låta ditt program använda keybd_event i ett visst tidsintervall.

Medlem sedan maj 20002 993 inlägg
#11

Kan man på nått sätt inte söka efter det med titeln eller nått?

283 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
153 ms — deklarationer (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)
154 ms — ändringar (db)