A Alpha II Medlem sedan maj 2000 2 993 inlägg Frågan 17 aug. 2002 23:06 #1 Hur kan jag göra så att datorn tror att vissa tangenter(bokstäver) trycks ner?
Marcus E Medlem sedan maj 2002 1 466 inlägg 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 );
}
Lasp Medlem sedan juli 2000 12 978 inlägg A Alpha II Medlem sedan maj 2000 2 993 inlägg 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å?
J jt Medlem sedan juni 2000 350 inlägg 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;*
A Alpha II Medlem sedan maj 2000 2 993 inlägg 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?
Marcus E Medlem sedan maj 2002 1 466 inlägg 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.
J jt Medlem sedan juni 2000 350 inlägg 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.
A Alpha II Medlem sedan maj 2000 2 993 inlägg Kan klassen verkligen heta "Afx:400000:b:10011:340185"??? Det ändras när man startar om spelet också..... Detr fungerar fö. inte heller... :(
Marcus E Medlem sedan maj 2002 1 466 inlägg
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.
A Alpha II Medlem sedan maj 2000 2 993 inlägg Kan man på nått sätt inte söka efter det med titeln eller nått?