עבור לתוכן

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

Featured Replies

פורסם

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

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

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

תודה.

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

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


#pragma once
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows 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
   );

ומוגדרת ב windows.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 נשלחות רק לחלון הנוכחי. (אפשר לעשות את זה עם windows hooks - כמו שבבילון עושה, אבל אתה לא רוצה להסתבך עם זה. תאמין לי.)

פורסם
  • מחבר

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

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

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

פורסם

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

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

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

פורסם
  • מחבר

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

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

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

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

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

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

תודה.

פורסם

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

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

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

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

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

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

[attachment deleted by admin]

ארכיון

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

דיונים חדשים