none
כיצד אני משנה focus של form ב -c#? RRS feed

  • שאלה

  • שלום,

    ברצוני לכתוב windows forms application פקודה שבעצם תוריד את הטופס שייפתח מהפוקוס. כלומר הוא לא יהיה הראשון על פני המסך אלא הדבר שהיה לפניו בפוקוס יהיה. כיצד אני יכול להחזיר אותו לפוקוס אחר כך?

    בתודה מראש

    אור

    • הועבר על-ידי Hengzhe Li יום רביעי 18 ינואר 2012 07:20 (מאת:Microsoft Visual C#)
    יום חמישי 12 ינואר 2012 15:55

תשובות

  • אני אנסה את כוחי בהבנה של הבעיה :-)

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

    למשל אם משתמש עובד בתוכנת X ואין לו מקלדת אז
    1. הוא יפעיל את התוכנה Y (שאותה אור מפתח)
    2. אז התוכנה תעלה בפוקוס.
    3. הוא ילחץ על כפתור עם העכבר בתוכנה Y
    4. אז התוכנה Y תרד מהפוקום ולכן תוכנה קודמת X תקבל פוקוס.
    5. תוכנה Y שאינה בפוקוס הפעילה דימוי של לחיצה על המקלדת והדימוי יופעל לכן על תוכנה X

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

    this.WindowState = FormWindowState.Minimized;

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

    Thread.Sleep(2000);

    * ניתן להוסיף בדיקה שאכן הפוקום לא על הטופס לפני השלב הבא

    ואז עלייך להריץ את השימוש ב sendkeys שיעבוד על התוכנה שנמצאת כרגע בפוקוס


    signature
    יום ראשון 15 ינואר 2012 21:36
    מנחה דיון

כל התגובות

  • יש לך form 1 להלן A ו forom 2  להלן B.

    תחילה עולה A והוא בפוקוס, אח"כ עולה B ואתה רוצה ש A ישאר בפוקוס.

    האם השאלה היא איך עושים ש Aישאר בפוקוס או איך מחזירים את הפוקוס ל B?

    כמו כן מה הכונה בדבריך "כלומר הוא לא יהיה הראשון על פני המסך " - איזה פורום יהיה עליון?

     


    בהצלחה, ואם עזרתי, לחץ על 'סמן כתשובה', וסמן את התשובה כמועילה.
    • נערך על-ידי ipdd יום חמישי 12 ינואר 2012 19:24
    יום חמישי 12 ינואר 2012 18:10
  • שלום,

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

     

    פוקוס=ראשון על המסך. לא?

    תודה,

    אור

    יום חמישי 12 ינואר 2012 20:19
  • מה אתה רוצה שיגרום לתוכנה שלך לחזור לפוקוס?

    לדוגמא כאשר יש לך למשל תוכנת וורד פתוחה ואז אתה פותח דפדפן. הדפדפן נהיה בפוקוס. עכשיו אתה רוצה להחזיר את הוורד לפוקוס, אז אתה מקליק על החלון של הוורד במידה וזה לא מסך מלא, או על האייקון ב task bar ואז הוורד חוזר לפוקוס.

    מה הסנריו שלך? אתה רוצה שהתוכנה שלך תחזור לפוקוס בלי שהמשתמש ילחץ על משהו? אם כן בתגובה לאיזה אירוע?


    בהצלחה, ואם עזרתי, לחץ על 'סמן כתשובה', וסמן את התשובה כמועילה.
    יום ראשון 15 ינואר 2012 12:28
  • אני רוצה שהתוכנית שלי תרד מהפוקוס/ תחזור אליו בעצמה, כלומר ללא לחיצה על הייישום שפתוח מתחתיה. זה משנה בתגובה לאיזה אירוע? לחיצת עכבר למשל במקום מסויים בטופס, או דאבל קליק. בעיקרון המטרה שלי היא שכשהארוע יקרה, הפורמ ירד מהפוקוס ולאחר מכן יחזור אליו.

    תודה,

    אור

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

    תנסה לתאר את הצורך, למה אתה צריך דבר כזה ואיזה בעיה זה פותר לך וזה יכוון אותנו לעזור.


    בהצלחה, ואם עזרתי, לחץ על 'סמן כתשובה', וסמן את התשובה כמועילה.
    יום ראשון 15 ינואר 2012 19:56
  • הצורך הוא עבור שימוש בפקודה sendkeys. כיון שפקודה זו שולחת את המקשים למה שבפוקוס, אני צריך שבעת השימוש הטופס שלי כאשר תהיה לחיצה עליו, הוא ירד מהפוקוס והתוכנה תחתיו תעלה כדי שיוקלד בה התו שנשלח.

    האירוע הוא לחיצה כפולה או לחיצה בודדת, אני די בטוח שזה לא ממש משנה.

    יום ראשון 15 ינואר 2012 20:02
  • מקוה שהבנתי נכון...

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

     Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Form1.Focus()
    
        End Sub
    

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

    כמובן שאתה יכול בתוך form1 להכניס לפוקוס textbox מסוים על מנת שהקוד יכנס אליו, בדיוק באותה הדרך.


    בהצלחה, ואם עזרתי, לחץ על 'סמן כתשובה', וסמן את התשובה כמועילה.
    יום ראשון 15 ינואר 2012 20:47
  • אני אנסה את כוחי בהבנה של הבעיה :-)

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

    למשל אם משתמש עובד בתוכנת X ואין לו מקלדת אז
    1. הוא יפעיל את התוכנה Y (שאותה אור מפתח)
    2. אז התוכנה תעלה בפוקוס.
    3. הוא ילחץ על כפתור עם העכבר בתוכנה Y
    4. אז התוכנה Y תרד מהפוקום ולכן תוכנה קודמת X תקבל פוקוס.
    5. תוכנה Y שאינה בפוקוס הפעילה דימוי של לחיצה על המקלדת והדימוי יופעל לכן על תוכנה X

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

    this.WindowState = FormWindowState.Minimized;

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

    Thread.Sleep(2000);

    * ניתן להוסיף בדיקה שאכן הפוקום לא על הטופס לפני השלב הבא

    ואז עלייך להריץ את השימוש ב sendkeys שיעבוד על התוכנה שנמצאת כרגע בפוקוס


    signature
    יום ראשון 15 ינואר 2012 21:36
    מנחה דיון
  • תודה רבה pituach, הפיתרון שלך עוזר לי מאוד. למרות זאת קיוויתי למשהו מהיר יותר.

    ipdd, אתה בטוח שמה שכתבת זה בC#? לא הצלחתי להריץ אותו.

     

    תודה לכם,

    אור

    יום שני 16 ינואר 2012 19:16
  • א. יכלת לקבל תשובה מהירה יותר אם רק היית מסביר בצורה בהירה מה בדיוק המצב, ומה הצורך.

    ב. הקוד שכתבתי הוא ב VB.NET - לא זכור לי שכתבת באיזה שפה אתה כותב, בכל מקרה הקוד לא שונה בהרבה...


    בהצלחה, ואם עזרתי, לחץ על 'סמן כתשובה', וסמן את התשובה כמועילה.
    יום שני 16 ינואר 2012 19:51
  • ipdd תרשה לי תיקון קטן

    * אנחנו נמצאים בפורום ייחודי לשפת C#
    * בכותרת השאלה שלו רשום במפורש שהוא עובד ב C#

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

    לכן ההמצלה שלי למי שקורא את זה תמיד לנסות לשים הסבר מפורט ובעיקר במקרה שלקשור לאירועים לפרט שלב אחרי שלב בדיוק מה קורה. לרשום בדיוק בסגנון של: מבצעים X -> ואז מבצעים Y -> ולכן קורה Z -> ואז רוצים שיקרה K ...


    signature
    יום שלישי 17 ינואר 2012 08:49
    מנחה דיון