@Mathias: Danke, so funktioniert das in der Console. Mein Test schlägt noch fehl, zeigt aber jetzt das Testergebenis in der Console.
grafisch mach ich später, da muss ich ja wohl eine GUI Anwendung mit Formular auswählen? Oder geht da auch was mit der
Graphics Unit in meinem aktuellen Projekt?
@af0815: Danke für die Dokus. Werde mir die in den nächsten Tagen durcharbeiten. AssertFail, AssertTrue, & Co.
Momentan hält das Programm gar nicht an.
Code: Alles auswählen
procedure TWAPITestCase.TestGetMessage;
var msg: TMsg;
begin
if GetMessage(msg,0,0,0) then
case msg.message of
WM_KEYDOWN: writeln('Message: WM_KEYDOWN');
WM_KEYUP: writeln('Message: WMKEYUP');
end;
end; \0
Und hier ist GetMessage, meine eigene Implementation, die ich später brauche um andere API Funktionen auch zu implementieren und dann testen zu können.
Code: Alles auswählen
function GetMessage(out Msg: TMsg; wnd: HWND; wMsgFilterMin,wMsgFilterMax: UINT): Boolean;
const
PREV_KEY = $40000000;
EXT_KEY = $01000000;
var
c: char;
s: char;
key: word;
cchr: byte;
scan: byte;
kev: TKeyEvent;
ShftState,Flags: Byte;
wmkey: TWMKEY;
wmmou: TWMMOUSE;
_key: String;
waspressed: Boolean;
moupressed: Boolean;
begin
Result := false;
moupressed := false;
waspressed := false;
if keypressed then
begin
Msg.message := WM_KEYDOWN;
waspressed := true;
kev := PollKeyEvent;
{$ifdef linux}
_key := RawReadKey;
FindSequence(_key,cchr,scan);
{$endif}
Flags := GetKeyEventFlags(kev);
ShftState := GetKeyEventShiftstate(kev);
if (ShftState and kbCtrl) = kbCtrl then Include(Shift_State,ssCtrl) else Exclude(Shift_State,ssCtrl);
if (ShftState and kbAlt) = kbAlt then Include(Shift_State,ssAlt) else Exclude(Shift_State,ssAlt);
if (ShftState and kbShift) = kbShift then Include(Shift_State,ssShift) else Exclude(Shift_State,ssShift);
Key := GetKeyEventCode(kev);
c := GetKeyEventChar(kev);
wmkey.Msg := Msg.message;
wmkey.CharCode := cchr;
wmkey.Keydata := Longint(scan shl 16);
wmkey.Keydata := wmkey.Keydata or PREV_KEY;
Msg.message := wmkey.Msg;
Msg.WParam := wmkey.KeyData;
case scan of
1,2,4,8: wmkey.Keydata := wmkey.Keydata or 16777216;
{.$FF01..$FF2A: wmkey.Keydata := wmkey.Keydata or 1073741824;}
end;
c := #0; s := #0; key := 0; scan := 0;
Result := true;
end
else
if waspressed then
begin
Msg.message := WM_KEYUP;
wmkey.Keydata := wmkey.Keydata xor PREV_KEY;
Result := true;
end;
PollMouseEvent(Mouse_Event);
PutMouseEvent(Mouse_Event);
case Mouse_Event.Buttons of
MouseLeftButton:
begin
wmmou.msg := WM_LBUTTONDOWN;
moupressed := true;
wmmou.keys := MouseLeftButton;
wmmou.XPos := MouseWhereX;
wmmou.YPos := MouseWhereY;
Result := true;
end;
MouseMiddleButton:
begin
wmmou.msg := WM_MBUTTONDOWN;
wmmou.keys := MouseMiddleButton;
wmmou.XPos := MouseWhereX;
wmmou.YPos := MouseWhereY;
moupressed := true;
Result := true;
end;
MouseRightButton:
begin wmmou.msg := WM_RBUTTONDOWN;
wmmou.keys := MouseRightButton;
wmmou.XPos := MouseWhereX;
wmmou.YPos := MouseWhereY;
moupressed := true;
Result := true;
end;
end;
case Mouse_Event.Action of
MouseActionDown:
begin
case Mouse_Event.buttons of
MouseLeftButton:
begin
wmmou.msg := WM_LBUTTONDOWN;
wmmou.keys := MouseLeftButton;
wmmou.XPos := MouseWhereX;
wmmou.YPos := MouseWhereY;
Result := true;
moupressed := true;
end;
MouseMiddleButton:
begin
wmmou.msg := WM_MBUTTONDOWN;
wmmou.keys := MouseMiddleButton;
wmmou.XPos := MouseWhereX;
wmmou.YPos := MouseWhereY;
Result := true;
moupressed := true;
end;
MouseRightButton:
begin
wmmou.msg := WM_RBUTTONDOWN;
wmmou.keys := MouseRightButton;
wmmou.XPos := MouseWhereX;
wmmou.YPos := MouseWhereY;
Result := true;
moupressed := true;
end;
end;
end;
MouseActionMove:
begin
case Mouse_Event.buttons of
MouseLeftButton:
begin
wmmou.msg := WM_MOUSEMOVE;
wmmou.keys := MouseLeftButton;
wmmou.XPos := MouseWhereX;
wmmou.YPos := MouseWhereY;
Result := true;
moupressed := true;
end;
MouseMiddleButton:
begin
wmmou.msg := WM_MOUSEMOVE;
wmmou.keys := MouseMiddleButton;
wmmou.XPos := MouseWhereX;
wmmou.YPos := MouseWhereY;
Result := true;
moupressed := true;
end;
MouseRightButton:
begin
wmmou.msg := WM_MOUSEMOVE;
wmmou.keys := MouseRightButton;
wmmou.XPos := MouseWhereX;
wmmou.YPos := MouseWhereY;
Result := true;
moupressed := true;
end;
end;
end;
MouseActionUp:
begin
case Mouse_Event.Buttons of
MouseLeftButton:
begin
wmmou.msg := WM_LBUTTONUP;
wmmou.keys := MouseLeftButton;
wmmou.XPos := MouseWhereX;
wmmou.YPos := MouseWhereY;
Result := true;
moupressed := false;
end;
MouseMiddleButton:
begin
wmmou.msg := WM_MBUTTONUP;
wmmou.keys := MouseMiddleButton;
wmmou.XPos := MouseWhereX;
wmmou.YPos := MouseWhereY;
Result := true;
moupressed := false;
end;
MouseRightButton:
begin
wmmou.msg := WM_RBUTTONUP;
wmmou.keys := MouseRightButton;
wmmou.XPos := MouseWhereX;
wmmou.YPos := MouseWhereY;
Result := true;
moupressed := false;
end;
end;
end;
end;
end;
\0
Erwarten würde ich, dass GetMessage auf eine Eingabe von der Tastatur oder Maus wartet. Ich erhalte aber eine rollende Ausgabe von EAccessViolation at <Hexzahl>
Der Test schlägt also noch fehl, ich weiß aber nicht wo mein Fehler ist.
Weiß jemand Rat?
.