mbshareat
چهارشنبه 15 بهمن 1393, 20:50 عصر
سلام
یه بازی جدید اومده که اصالتا مال موبایل بوده!اسمش Subway Surf هستش.
چپ و راست رفتن و پرش و از زیر رفتنش با درگ ماوسه.
میخواستم درگ ماوس رو شبیه سازی کنم اما موفق نشدم:
..
private
{ Private declarations }
Procedure WMHotkey( Var msg: TWMHotkey );message WM_HOTKEY;
procedure MDrag(X, Y: Integer);
..
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotkey (Handle, 1, MOD_Control, Ord('A'));
RegisterHotkey (Handle, 2, MOD_Control, Ord('W'));
RegisterHotkey (Handle, 3, MOD_Control, Ord('D'));
RegisterHotkey (Handle, 4, MOD_Control, Ord('S'));
end;
...
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnRegisterHotkey( Handle, 1 ) ;
UnRegisterHotkey( Handle, 2 ) ;
UnRegisterHotkey( Handle, 3 ) ;
UnRegisterHotkey( Handle, 4 ) ;
end;
procedure TForm1.MDrag(X,Y:Integer);
Var
St:Word;
begin
St:=30000;
Application.ProcessMessages;
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN,St, St,0,0) ;
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE,St+X*10000,St+Y*10000,0,0);
Mouse_Event(MOUSEEVENTF_ABSOLUTE or OUSEEVENTF_LEFTUp,St+X*10000,St+Y*10000,0,0);
Application.ProcessMessages;
end;
Function WindowClassName(H:THandle):String;
Var
aName:array [0..255] of char;
begin
GetClassName(H,aName, 256);
Result:=aName;
end;
Function WindowCaption(H:THandle):String;
Var
aText:array [0..255] of char;
begin
SendMessage(H, WM_GETTEXT,
SizeOf(aText), integer(@aText)) ;
Result:=aText;
end;
Procedure TForm1.WMHotkey( Var msg: TWMHotkey ) ;
Var
R:TRect;
Begin
label1.Caption:=WindowCaption(WindowfromPoint(Poin t(500,500)))+intToStr(msg.hotkey);
// if WindowCaption(WindowfromPoint(Point(500,500)))
// <>'Subway Surfe' then
// exit;
Case msg.hotkey of
1://Left
MDrag(-1,0);
2://Up
MDrag(0,-1);
3://Right
MDrag(1,0);
4://Down
MDrag(0,1);
End;
End;
شبیه سازی درگ ماوس برای شبیه ساز بازیهای PSP هم به دردم میخوره.
یه سوال ریز هم دارم:برای به دست آوردن مختصات دقیق نقطه برای ارسال با SendMessage باید محل پیکسل رو ضرب در چه عددی بکنیم؟ظاهرا به DPI ربط داره ولی چیزی ازش یادم نمیاد.
کسی راهنمایی میکنه؟
یه بازی جدید اومده که اصالتا مال موبایل بوده!اسمش Subway Surf هستش.
چپ و راست رفتن و پرش و از زیر رفتنش با درگ ماوسه.
میخواستم درگ ماوس رو شبیه سازی کنم اما موفق نشدم:
..
private
{ Private declarations }
Procedure WMHotkey( Var msg: TWMHotkey );message WM_HOTKEY;
procedure MDrag(X, Y: Integer);
..
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotkey (Handle, 1, MOD_Control, Ord('A'));
RegisterHotkey (Handle, 2, MOD_Control, Ord('W'));
RegisterHotkey (Handle, 3, MOD_Control, Ord('D'));
RegisterHotkey (Handle, 4, MOD_Control, Ord('S'));
end;
...
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnRegisterHotkey( Handle, 1 ) ;
UnRegisterHotkey( Handle, 2 ) ;
UnRegisterHotkey( Handle, 3 ) ;
UnRegisterHotkey( Handle, 4 ) ;
end;
procedure TForm1.MDrag(X,Y:Integer);
Var
St:Word;
begin
St:=30000;
Application.ProcessMessages;
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN,St, St,0,0) ;
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE,St+X*10000,St+Y*10000,0,0);
Mouse_Event(MOUSEEVENTF_ABSOLUTE or OUSEEVENTF_LEFTUp,St+X*10000,St+Y*10000,0,0);
Application.ProcessMessages;
end;
Function WindowClassName(H:THandle):String;
Var
aName:array [0..255] of char;
begin
GetClassName(H,aName, 256);
Result:=aName;
end;
Function WindowCaption(H:THandle):String;
Var
aText:array [0..255] of char;
begin
SendMessage(H, WM_GETTEXT,
SizeOf(aText), integer(@aText)) ;
Result:=aText;
end;
Procedure TForm1.WMHotkey( Var msg: TWMHotkey ) ;
Var
R:TRect;
Begin
label1.Caption:=WindowCaption(WindowfromPoint(Poin t(500,500)))+intToStr(msg.hotkey);
// if WindowCaption(WindowfromPoint(Point(500,500)))
// <>'Subway Surfe' then
// exit;
Case msg.hotkey of
1://Left
MDrag(-1,0);
2://Up
MDrag(0,-1);
3://Right
MDrag(1,0);
4://Down
MDrag(0,1);
End;
End;
شبیه سازی درگ ماوس برای شبیه ساز بازیهای PSP هم به دردم میخوره.
یه سوال ریز هم دارم:برای به دست آوردن مختصات دقیق نقطه برای ارسال با SendMessage باید محل پیکسل رو ضرب در چه عددی بکنیم؟ظاهرا به DPI ربط داره ولی چیزی ازش یادم نمیاد.
کسی راهنمایی میکنه؟