มกราคม 18, 2018, 10:53:30 am *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: How To Simulate Mouse Events  (อ่าน 4896 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8270


ShadowWares


| |
« เมื่อ: พฤษภาคม 05, 2011, 09:54:51 pm »

วันนี้นั่งเล่นเกมส์คลิกยิงเครื่องบิน เล่นยังไงก็ไม่ชนะสักที เลยหวนคิดไปยังตอนที่กำลังศึกษาการเขียนโปรแกรมแนวศาสตร์มืด
เลยคิดขึ้นได้ว่าเราสามารถสั่ง/หลอก Windows ว่าเราเลื่อนหรือคลิก Mouse ได้ โดยการใช้ API Functions ของ Windows เอง
หลายคนเรียกว่า mouse event simulation หรือคำอื่นๆ ที่ใกล้เคียง ก็แล้วแต่จะเรียกกันไป
เข้าเรื่องกันเลยดีกว่า เนื่องจากระบบ Windows ว่ากันด้วย Events หรือเหตุการณ์ต่างๆที่เกิดขึ้น ไม่ว่าจะเกิดจากโปรแกรมต่างๆ หรือจาก
ผู้ใช้งานคอมพิวเตอร์เอง เช่นการใช้ Mouse, Keyboard และต่างๆ เพื่อควบคุมคอมพิวเตอร์ให้ทำงานอะไรบางอย่าง เหตุการณ์ทั้งหมด
ในระบบคอมพิวเตอร์ ไม่ว่าจะเป็น Hardware หรือ Software จะถูกตีความเป็น Message หรือที่เรียกว่า Window Message จริงๆ
มันก็คือตัวเลขจำนวนเต็มขนาด 32-bit นั่นเอง

ยกตัวอย่างเช่นต้องการคลิกซ้ายที่จตำแหน่ง x=100, y=200 จะเขียนโปรแกรมได้ดังนี้

Code: (c)

int x = 100;
int y = 200;
DWORD dw = MAKEWORD(x, y);
PostMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, dw);
// หรือ
SentMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, dw);


หรือถ้าหากต้องการ Click ที่ Window ใดๆ ที่ Mouse ชี้อยู่ก็สามารถทำได้เช่นกันตามนี้
Code: (c)
POINT pt;
GetCursorPos(&pt);
HWND hWnd = WindowFromPoint(pt);
DWORD dw = MAKEWORD(pt.x, pt.y);
PostMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, dw);


วันนี้โชคไม่ดี วิธีนี้ไม่ทำงานเหมือนที่เคยทำได้เหมือนบน WindowXP ซะแล้ว แต่ไม่ขอยืนยันว่าเป็นที่ Windows
สาเหตุที่มันไม่ทำงานอาจจะมาจากอย่างอื่นก็ได้ ไม่รู้สิ คิดไม่ออก แต่ที่รู้คือเมื่อวีธีนี้ไม่ได้ มีวิธีอื่นที่ให้ผลดี เป็นการเขียนโปรแกรม
ระดับล่างลงไปอีกหน่อย วิธีนี้พวก Cracker มือใหม่จะนิยมใช้กัน นั่นคือ INPUT ดูตัวอย่างกันเลย

Code: (c)

POINT pt;
GetCursorPos(&pt);
INPUT Input = {0};
Input.type  = INPUT_MOUSE;
Input.mi.dx = (LONG)pt.x;
Input.mi.dy = (LONG)pt.y;
Input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP;
// แบบ เยอะๆ ก็ได้เช่น
// Input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP;
SendInput(1,&Input,sizeof(INPUT));
// หากต้องการแบบ double-click ก็เพิ่ม SendInput(1,&Input,sizeof(INPUT)); ไปอีกที


วิธีนี้ได้ผลแน่นอน ลองนำไปใช้กันดูครับ
ส่วนผมก็ต้องขอตัวไป Crack Game ก่อน
 ;D


 
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
ac_toto
Jr. Member
**
ออฟไลน์ ออฟไลน์

กระทู้: 63


| |
« ตอบ #1 เมื่อ: มิถุนายน 27, 2012, 12:05:49 pm »

จากโค้ดตัวอย่างชุดล่างสุด ผมลองเอาไปเลื่อน mouse ดูแต่พิกัดเป็นแบบ absolute position (ดูจาก reference ประกอบ)
ถ้าผมต้องการแบบที่กำหนดพิกัดแบบ coordinate ของ x,y ไปเลยจะต้องทำแบบใหนเหรอครับ

ปล.จะเอาไปเล่นเกมเช่นกันครับ อิอิ
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8270


ShadowWares


| |
« ตอบ #2 เมื่อ: มิถุนายน 28, 2012, 09:04:40 pm »

การเปลี่ยนแกน ย้ายแกน สามารถทำได้โดยสมการเชิงเส้นพื้นฐาน หรือใช้ API ฟังก์ชั่นของ Windows ได้เลยครับ (ผมจำชื่อไม่ได้ ต้องลองเข้าไปรื้อใน MSDN เอาเอง)

เล่นเกมส์เล่นให้สนุก ไม่ได้เล่นให้ชนะ แต่ถ้าเล่นแล้วไม่ชนะ ก็หาความสนุกไม่ได้

ไปเล่นเกมส์ต่อดีกว่า วันนี้ไม่ชนะ ไม่นอน
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: