עבור לתוכן

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

Featured Replies

פורסם

אהלן. אני נתקלתי בבעיה. בניתי תוכנה קטנה (Visual Basic) שמזהה לחיצה בשלט XBOX ושולחת מקש במקלדת לפי תו שרשום בbtnY.text:

If currentStateButtons.Buttons.Y = ButtonState.Pressed Then

My.Computer.Keyboard.SendKeys(btnY.Text, False)

End If

הבעיה היא, שעד שאני משחרר את לחיצת הכפתור בשלט, עוברת כחצי שניה ואני מסיים עם משהו כזה (נניח הגדרתי מחרוזת text בשדה btnY):

texttexttexttexttext

במקום שילחץ לי על המקלדת פעם אחת text

איך אני פותר את הבעיה?

אני משתמש בVisual Studio 2010.

פורסם

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

פורסם
  • מחבר

הבעיה שיש או - מצב pressed או מצב released. הקוד פועל על טיימר, ואם אני מגדיר את הIF ב: released אז הקוד יפעל תמיד כשהכפתור לא לחוץ.

שינוי interval של טיימר לא עוזר ומחזיר לי את אותה הבעיה שתיארתי בהודעה הראשונה.

או שלא הבנתי אותך נכון?

פורסם

תוסיף עוד משתנה ודרכו תבדוק אם בוצעה לחיצה-משהו כזה:


pressed=0\\מאפס את המשתנה למקרה שהוא לא אופס לפני
IF currentStateButtons.Buttons.Y = ButtonState.Pressed Then
pressed=1\\מגדיר את המשתנה כ1 במצב של לחיצה
if(pressed>=1) then My.Computer.Keyboard.SendKeys(btnY.Text, False)
end if
End If
pressed=0//מאפס את המשתנה שוב כדי שלא יהיו שגיאות

פורסם
  • מחבר

לא, זה לא עובד :(

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

פורסם

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

עריכה- רגע אתה שם את הקוד בתוך טיימר?

פורסם
  • מחבר

כן השתמשתי בטיימר. יש אופציה יותר טובה?

בינתיים פתרתי את זה ב: Threading.Thread.Sleep(200)

אבל אם אפשרי לא להשתמש בטיימר אלא במשהו יותר יעיל, אשמח להצעות. תודה :)

פורסם

אתה רוצה שיהיה לזה מוניטורינג קבוע?

האמת שלא נגעתי בוויזואל בייסיק שנים אבל הייתי מנסה לשים את זה ב

form.active או משהו דומה..

אני מאמין שחיפוש בגוגל ימצא לך יותר תוצאות

פורסם

לא הבנת אותי נכון.

צור משתנה בשם pressed.

אם הכפתור לחוץ וגם pressed==false אז בצע את הפעולה ושים pressed=true.

אם הכפתור לא לחוץ אז שים pressed=false.

פורסם
  • מחבר

עשיתי בדיוק מה שאמרת וזה לא עובד :(


Pressed = False

If currentStateButtons.Buttons.B = ButtonState.Pressed Then
If (currentStateButtons.Buttons.B = ButtonState.Pressed) And (BPressed = False) Then
My.Computer.Keyboard.SendKeys(btnB.Text)
BPressed = True
End If
ElseIf currentStateButtons.Buttons.B = ButtonState.Pressed Then
BPressed = False
End If
End If

ניסיתי else במקום elseif ועוד כמה קומבינציות. שום דבר.

פורסם

השם משתנה שלך בשורה הראשונה לא נכון

פורסם

אולי תעלה את כל הקוד ולא רק את הקטע הזה? קשה להבין מה בדיוק קורה מתי הקוד הזה נקרא.

פורסם
  • מחבר

זה כל הקוד:



Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim currentStateButtons As GamePadState = GamePad.GetState(Microsoft.Xna.Framework.PlayerIndex.One)
Dim BPressed As Boolean
BPressed = False
Label3.Text = BPressed
If currentStateButtons.IsConnected = True Then
If currentStateButtons.Buttons.A = ButtonState.Pressed Then
If (currentStateButtons.Buttons.A = ButtonState.Pressed) And (BPressed = False) Then
My.Computer.Keyboard.SendKeys(btnA.Text)
BPressed = True
End If
ElseIf currentStateButtons.Buttons.A = ButtonState.Pressed Then
BPressed = False
End If
End If
End Sub

פורסם

תשמור את BPressed מחוץ לפונקציה, ואל תאפס אותו כל פעם. מה שקורה כרגע הוא שכל פעם שנכנסים לפונקציה הוא מתאפס, ככה שהבדיקה האם BPressed = False היא חסרת משמעות.

חוץ מזה ה-ElseIf שלך שגוי - אתה בודק שוב שהכפתור לחוץ במקום לבדוק שהוא לא לחוץ (ובכלל היה מספיק רק לשים Else).

ארכיון

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

דיונים חדשים