להזיז את העכבר בשפת C++. - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

להזיז את העכבר בשפת C++.


Ghosthunter

Recommended Posts

רציתי לדעת האם ניתן להזיז את העכבר על המסך ב- CPP. אני משתמש בVC++ 6.

הכוונה שלי היא לא לקלוט את המיקום שלו אלא לשנות את המיקום שלו איך שאני(המתכנת) רוצה, ולא המשתמש.

כל הדוגמאות שמצאתי רק קולטות ולא משנות.

תודה.

חחח טוב ראיתי כל הזמן GET ועכשיו חשבתי לשים שם SET, אז שמתי שם והצלחתי.

תראו מה עשיתי:


#pragma once
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from headers
#define _WIN32_WINNT 0x0500 // so the code would compile
#include <iostream.h>
#include <windows.h>

class CMouse
{
private:
POINT pos_m;
POINT add_m;
public:
CMouse(int add_x, int add_y)
{
GetCursorPos(&pos_m);
add_m.x=add_x;
add_m.y=add_y;
}

void move_mouse()
{
move_mouse(add_m);
}

void move_mouse(POINT add)
{
pos_m.x+=add.x;
pos_m.y+=add.y;
SetCursorPos(pos_m.x, pos_m.y);
}

bool fall(int gravity, double h)
{
add_m.y+=gravity;
move_mouse();
if(pos_m.x>=GetSystemMetrics(SM_CXSCREEN))
add_m.x*=-1;
if(pos_m.y>=GetSystemMetrics(SM_CYSCREEN))
add_m.y*=-h;
if(add_m.y==0 && pos_m.y>=GetSystemMetrics(SM_CYSCREEN))
return false;
return true;
}
};


int main(int argc, char* argv[])
{
int gravity=1;
double h=0.75;
bool on=true;
CMouse m(10,0);


while(on)
{
on=m.fall(gravity, h);

Sleep(40);
}

return 0;
}

קישור לתוכן
שתף באתרים אחרים

אתה צריך להשתמש בפוקנציה SetCursorPos שמוגדרת כך:


BOOL SetCursorPos(

    int X, // horizontal position 
    int Y // vertical position
   );

ומוגדרת ב .h

עריכה: אופס, לא שמתי לב שכתבת שהצלחת :/ טוב נו...

קישור לתוכן
שתף באתרים אחרים

טוב, שיניתי את התוכנית שלי, כך שהיא יכולה לשמור הזזבה ולחיצות על העכבר(עד עכשיו היא יכולה רק לקרוא מקובץ לא לשמור), ולעשות בידיוק אותו דבר.

אז, איך אני בודק את המשתמש לחץ על העכבר?

קישור לתוכן
שתף באתרים אחרים

כדי לבדוק את מצב הכפתורים של העכבר אתה יכול להשתמש ב- GetAsyncKeyState.

כדי לקבל event כל פעם שכפתור נלחץ אתה צריך לטפל ב- message המתאים -

למשל - בשביל קליק על הכפתור השמאלי אתה צריך את WM_LBUTTONDOWN

קישור לתוכן
שתף באתרים אחרים

זה תלוי מה אתה רוצה לעשות.

באפליקציות של בדר"כ משתמשים ב- events/messages כדי לקבל קלט (עבור קלט מהמקלדת - דרך WM_KEYDOWN/WM_KEYUP)

ב- GetAsyncKeyState משתמשים בעיקר למשחקים או כשלא עובדים בכלל עם - אפשר לטפל בצירופי מקשים ולמדוד את משך הזמן שמקש מסוים לחוץ

קישור לתוכן
שתף באתרים אחרים

כשאני בודק עם הפונ שנתת לי, הוא כנראה נותן לך עבור KEYDOWN, ולא עבור CLICK. בדקתי בMSDN, והיה רשום שם שאם הספרה הכי פחות משמעותית(אם המספר אי זוגי) דלוקה, אז הוא נלחץ אחרי הקריאה הקודמת, כלומר זהו אירוע CLICK, והוא לא היה לחוץ עוד קודם לכן.

אם זה לחוץ בכלל, אז הספרה הכי משמעותית דלוקה.

מכיוון שזהו SHORT, המסכה שלי צריכה להיות: 0x1000000000000001 (גם לחוץ, וגם CLICK ולא רק DOWN).

למרבה הפלא זה לא כל כך עובד לי.

עריכה: משהו מוזר בהחלט... אני הייתי צריך לעשות אותם בנפרד(0x1000000000000000 ו 0x0000000000000001 עם && ביניהם, ולא רק 0x1000000000000001).

עריכה 2: טוב הדרך הראשונה שהצעתי בייתה בעצם או ולא וגם.

יש לי עכשיו עוד בעיה: כשאני מנסה לקלוט את הלחיצה מחלון אחר אני לא יכול. אני צריך קודם לעבור לאותו חלון(לא משנה איך) ואז ללחוץ איפה שאני רוצה באותו חלון.

קישור לתוכן
שתף באתרים אחרים

אוקיי, לפי הסדר - (ועדיין לא הסברת למה אתה רוצה להשתמש בזה)

SHORT זה 16 ביט. מה שאתה רשמת זה 64 ביט (0x זה קידומת למספר ב- hex). הביט הפחות משמעותי זה 0x1 והכי משמעותי זה 0x8000.

עם GetAsyncKeyState אתה כן מקבל את מצב המקשים כאשר החלון שלך הוא לא הנוכחי.

עם WM_KEYDOWN אתה לא, כי messages של keyboard נשלחות רק לחלון הנוכחי. (אפשר לעשות את זה עם hooks - כמו שבבילון עושה, אבל אתה לא רוצה להסתבך עם זה. תאמין לי.)

קישור לתוכן
שתף באתרים אחרים

אוקיי, לפי הסדר - (ועדיין לא הסברת למה אתה רוצה להשתמש בזה)משהו שקשור לתמיכה טכנית

SHORT זה 16 ביט. מה שאתה רשמת זה 64 ביט (0x זה קידומת למספר ב- hex). הביט הפחות משמעותי זה 0x1 והכי משמעותי זה 0x8000.עכשיו אני מבולבל... זה עובד לי טוב עכשיו איך שעשיתי...(יש לי שם 16 מקומות ל-1 ו- 0)

עם GetAsyncKeyState אתה כן מקבל את מצב המקשים כאשר החלון שלך הוא לא הנוכחי.אני מקבל רק אחרי שאני עושה(ידנית, אני לא יודע איך אוטו) פוקוס על החלון. אני צריך ללחוץ פעמיים כדי לומר לתוכנה שלי שלחצתי שם.

קישור לתוכן
שתף באתרים אחרים

יכול להיות שזה עובד לך במקרה (אתה אמור לקבל warning שיש לך קבוע באורך גדול מדי) ובמילא מספיק לך הביט הפחות משמעותי.

אני יכול לשלוח לך את התוכנית נסיון שעשיתי (קראתי ל- GetAsyncKeyState עם טיימר ובדקתי לחיצה על מקש מסוים)

יכול להיות שאצלך אתה בודק את מצב המקשים רק שהחלון פעיל, או שאתה משתמש בטעות ב- GetKeyState או GetKeyboardState.

קישור לתוכן
שתף באתרים אחרים

אני לא מקבל WARNING. אם הביט הכי פחות משמעותי דלוק בלבד, אז אני מאמין שזה בודק אם זה mouseup(כעת כבוי ובקודם היה דלוק). אבל אני לא בטוח לגבי זה.

אני אנסה לבדוק עם מה שאמרת לי לגבי הכי משמעותי ופחות משמעותי. אם זה יעבוד אני אשאיר.

שיניתי וזה מתנהג בידיוק אותו דבר, אז אני אשאיר.

עדיין לא נפתרה הבעיה של הFOCUS של החלון. זה 100% בעיה של הפוקוס לא של משהו אחר.

אני משתמש בGetAsyncKeyState. אני לא יודע איך לבדוק שהחלון פעיל\לא פעיל וכן הבעיה שאמרת מקודם לא רלונטית.

רק אחרי שאני עובר לחלון כלשהו(אחרי שאני לוחץ עליו, והWINDOWS מעביר אותי אליו) אני יכול ללחוץ עליו. בפעם הראשונה שאני לוחץ עליו הוא לא עובר(הדפסתי משהו כל פעם שהמשתמש לוחץ, וזה לא אמר לי שהוא לוחץ כשעשיתי את זה), ר קבפעם השניה הוא מזהה לחיצה.

תודה.

קישור לתוכן
שתף באתרים אחרים

טוב, אני לא יודע בדיוק מה הבעיה אצלך בתוכנית.

תחת יש תמיד חלון אחד שלו יש keyboard focus. במצב נורמלי, רק לחלון הזה נשלחים messages של keyboard.

הדרך ה"נכונה" לקבל messages כאלה לחלון שהוא לא החלון הפעיל הוא דרך hooks שהוא נושא קצת tricky, אבל אם יש לך כוח לזה, לך על זה.

יכול להיות שמשום מה הפונקציה שלך שבודקת לחיצה על מקש לא נקראת שהחלון לא פעיל.

נסיתי לצרף כאן את הקבצים של תוכנית הדוגמא.

אם לא עובד ואתה רוצה לראות אותה בכל זאת - תגיד לי, אני אשלח לך אותה בדרך יותר נורמלית.

[attachment deleted by admin]

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...