דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. קליטת תו מהקונסול - #C

קליטת תו מהקונסול - #C

מתוזמן נעוץ נעול הועבר תכנות
13 פוסטים 4 כותבים 326 צפיות 3 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • yyyY מנותק
    yyyY מנותק
    yyy
    כתב ב נערך לאחרונה על ידי
    #1

    יש לי קונסול שהדפסתי בו ABC, כעת אני רוצה "לקחת" מההדפס (הקונסול השחור) את ה-B ולהכניס אותו לתוך משתנה. האם אפשר, ואיך אני עושה את זה?
    במילים אחרות אני רוצה שה-Input יגיע מהמסך ולא ממשתנה או מהמשתמש.
    תודה רבה.

    תגובה 1 תגובה אחרונה
    0
    • dovidD מנותק
      dovidD מנותק
      dovid
      ניהול
      כתב ב נערך לאחרונה על ידי
      #2

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

      • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
      • בכל נושא אפשר ליצור קשר dovid@tchumim.com
      yyyY yossizY 2 תגובות תגובה אחרונה
      4
      • dovidD dovid

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

        yyyY מנותק
        yyyY מנותק
        yyy
        כתב ב נערך לאחרונה על ידי yyy
        #3

        @dovid כתב בקליטת תו מהקונסול - #C:

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

        אני מיישם לוח משחק ומנסה לחסוך מטריצת משתנים.

        תגובה 1 תגובה אחרונה
        0
        • dovidD dovid

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

          yossizY מנותק
          yossizY מנותק
          yossiz
          כתב ב נערך לאחרונה על ידי yossiz
          #4

          @dovid כתב בקליטת תו מהקונסול - #C:

          להבנתי אי אפשר מהקונסול הרגיל

          גם אני חשבתי כמוך אבל למרבה הפלא מתברר שזה לא נכון

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

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

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

          ב-#C (דוטנט) אין פוקנציה לקרוא את ה-buffer של הטרמינל, אבל יש פונקציה נייטיבית לזה, כתבתי קוד פייתון שמדגים את זה
          שים לב שאפשר ככה לגנוב פלט מפקודות קודמות 😮 😮 😮
          זה היה פלא בעיני שיש חור אבטחה/פרטיות כזה בווינדוס, אבל שוב התבוננתי שהתוקף הנחוש יכול לקבל את התוכן של הקונסול בכמה דרכים אחרות ואז נחה דעתי

          from win32console import PyConsoleScreenBufferType, PyCOORDType, GetStdHandle, STD_OUTPUT_HANDLE
          
          buffer = PyConsoleScreenBufferType(GetStdHandle(STD_OUTPUT_HANDLE))
          info = buffer.GetConsoleScreenBufferInfo()
          print("=" * info["Size"].X)
          print("YOUR CONSOLE HISTORY")
          print("=" * info["Size"].X)
          print(buffer.ReadConsoleOutputCharacter(info["Size"].X * info["CursorPosition"].Y, PyCOORDType(0,0)))
          print("=" * info["Size"].X)
          

          אפשר להשתמש בפונקציות אלו של ווינדוס גם בדוטנט ע"י P/Invoke

          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

          dovidD תגובה 1 תגובה אחרונה
          5
          • yossizY yossiz

            @dovid כתב בקליטת תו מהקונסול - #C:

            להבנתי אי אפשר מהקונסול הרגיל

            גם אני חשבתי כמוך אבל למרבה הפלא מתברר שזה לא נכון

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

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

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

            ב-#C (דוטנט) אין פוקנציה לקרוא את ה-buffer של הטרמינל, אבל יש פונקציה נייטיבית לזה, כתבתי קוד פייתון שמדגים את זה
            שים לב שאפשר ככה לגנוב פלט מפקודות קודמות 😮 😮 😮
            זה היה פלא בעיני שיש חור אבטחה/פרטיות כזה בווינדוס, אבל שוב התבוננתי שהתוקף הנחוש יכול לקבל את התוכן של הקונסול בכמה דרכים אחרות ואז נחה דעתי

            from win32console import PyConsoleScreenBufferType, PyCOORDType, GetStdHandle, STD_OUTPUT_HANDLE
            
            buffer = PyConsoleScreenBufferType(GetStdHandle(STD_OUTPUT_HANDLE))
            info = buffer.GetConsoleScreenBufferInfo()
            print("=" * info["Size"].X)
            print("YOUR CONSOLE HISTORY")
            print("=" * info["Size"].X)
            print(buffer.ReadConsoleOutputCharacter(info["Size"].X * info["CursorPosition"].Y, PyCOORDType(0,0)))
            print("=" * info["Size"].X)
            

            אפשר להשתמש בפונקציות אלו של ווינדוס גם בדוטנט ע"י P/Invoke

            dovidD מנותק
            dovidD מנותק
            dovid
            ניהול
            כתב ב נערך לאחרונה על ידי dovid
            #5

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

            • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
            • בכל נושא אפשר ליצור קשר dovid@tchumim.com
            תגובה 1 תגובה אחרונה
            0
            • Aharon 0A מנותק
              Aharon 0A מנותק
              Aharon 0
              כתב ב נערך לאחרונה על ידי
              #6

              https://stackoverflow.com/questions/12355378/read-from-location-on-console-c-sharp#answer-12366307

              תגובה 1 תגובה אחרונה
              2
              • yossizY מנותק
                yossizY מנותק
                yossiz
                כתב ב נערך לאחרונה על ידי yossiz
                #7

                @dovid זה לא דומה כלל ל-WM_GETTEXT או ל-API של הנגישות, מדובר על אותו buffer שאתה כותב לו כדי להציג דברים בקונסול, יש פונקציה לשלוף מאותו buffer עצמו. זה כמעט דרך המלך. אלא שיותר נכון לבנות את המשחק בצורה שאתה שומר state בתוך הקוד שלך ומרנדר לקונסול לפי הצורך מה-state שלך ולא לסמוך על הטקסט של הקונסול לשמור בשבילך state
                (יש הסתייגות נוספת, שמייקרוסופט רוצים שתשתמש ב-API החדש של הטרמינל שבנוי כמו בלינוקס שאין לך גישה ל-buffer ולא להשתמש ב-API הישנים, אבל הם בעצמם אומרים שהם ממשיכים לתמוך בזה בצורה מלאה)

                📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                תגובה 1 תגובה אחרונה
                2
                • dovidD מנותק
                  dovidD מנותק
                  dovid
                  ניהול
                  כתב ב נערך לאחרונה על ידי dovid
                  #8

                  @yossiz לא נשארתי בתשובת ה"אי אפשר" בגלל שדרכך איננה דרך המלך אלא כי כל הכיוון הוא לא נורמטיבי דרך פקודות הקונסול הרגילות.
                  בכל מקרה השאלה פה צועקת את XY Problem.

                  • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                  • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                  yyyY תגובה 1 תגובה אחרונה
                  0
                  • dovidD dovid

                    @yossiz לא נשארתי בתשובת ה"אי אפשר" בגלל שדרכך איננה דרך המלך אלא כי כל הכיוון הוא לא נורמטיבי דרך פקודות הקונסול הרגילות.
                    בכל מקרה השאלה פה צועקת את XY Problem.

                    yyyY מנותק
                    yyyY מנותק
                    yyy
                    כתב ב נערך לאחרונה על ידי
                    #9

                    @dovid כתב בקליטת תו מהקונסול - #C:

                    בכל מקרה השאלה פה צועקת את XY Problem.

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

                    תגובה 1 תגובה אחרונה
                    0
                    • dovidD מנותק
                      dovidD מנותק
                      dovid
                      ניהול
                      כתב ב נערך לאחרונה על ידי
                      #10

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

                      • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                      • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                      yyyY תגובה 1 תגובה אחרונה
                      1
                      • dovidD dovid

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

                        yyyY מנותק
                        yyyY מנותק
                        yyy
                        כתב ב נערך לאחרונה על ידי
                        #11

                        @dovid כתב בקליטת תו מהקונסול - #C:

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

                        אני פשוט טוען שנושא ה-X שלי הוא רצון להכיר טוב יותר את המערכת, ולכן הבעיה שהצגתי היא ה-X עצמו ולא Y.

                        yossizY תגובה 1 תגובה אחרונה
                        0
                        • yyyY yyy

                          @dovid כתב בקליטת תו מהקונסול - #C:

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

                          אני פשוט טוען שנושא ה-X שלי הוא רצון להכיר טוב יותר את המערכת, ולכן הבעיה שהצגתי היא ה-X עצמו ולא Y.

                          yossizY מנותק
                          yossizY מנותק
                          yossiz
                          כתב ב נערך לאחרונה על ידי yossiz
                          #12

                          @yyy אני מסכים לך שחקירת נושאים כאלו מרחיבים את הידע
                          בשאלות מסוג זה המידע עצמה של התשובה עונה לך על השאלה אבל זה משהו ש-99% מהמתכנתים לא יודעים ולא צריכים לדעת (בגלל הטענה של דוד שיש צורה אחרת לפתור את הבעיה), ויש מליון וחצי כאלו פיסות מידע ששימושיים חד פעמי למקרים ספציפיים
                          הכישור למצוא תשובה לשאלה כזאת הוא יותר חשוב, כדי שמתי שבאמת אתה צריך תשובה תוכל להגיע לזה בכוחות עצמך
                          וגם בחקירת נושא כזה אפשר ללקט על הדרך ידע כללי בנושא
                          נהניתי מהשאלה והחיפוש לתשובה זה נושא שמעניין אותי אז תודה על העלאת השאלה 🙂
                          תהליך ההגעה לתשובה שלי היה כנראה על ידי חיפוש גוגל (אני לא מוצא כעת את החיפוש המדוייק בהיסטורית הדפדפן) שזה הביא אותי לתשובה ב-stackoverflow שהוביל אותי לתיעוד המקורי של מייקרוסופט על נושא הקונסול, קריאה של כמה עמודי תיעוד (והכירות קודמת בנושאים שמסביב לתוכנות של שורות הפקודה) עזרו אותי בתשובת השאלה

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

                          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                          yyyY תגובה 1 תגובה אחרונה
                          4
                          • yossizY yossiz

                            @yyy אני מסכים לך שחקירת נושאים כאלו מרחיבים את הידע
                            בשאלות מסוג זה המידע עצמה של התשובה עונה לך על השאלה אבל זה משהו ש-99% מהמתכנתים לא יודעים ולא צריכים לדעת (בגלל הטענה של דוד שיש צורה אחרת לפתור את הבעיה), ויש מליון וחצי כאלו פיסות מידע ששימושיים חד פעמי למקרים ספציפיים
                            הכישור למצוא תשובה לשאלה כזאת הוא יותר חשוב, כדי שמתי שבאמת אתה צריך תשובה תוכל להגיע לזה בכוחות עצמך
                            וגם בחקירת נושא כזה אפשר ללקט על הדרך ידע כללי בנושא
                            נהניתי מהשאלה והחיפוש לתשובה זה נושא שמעניין אותי אז תודה על העלאת השאלה 🙂
                            תהליך ההגעה לתשובה שלי היה כנראה על ידי חיפוש גוגל (אני לא מוצא כעת את החיפוש המדוייק בהיסטורית הדפדפן) שזה הביא אותי לתשובה ב-stackoverflow שהוביל אותי לתיעוד המקורי של מייקרוסופט על נושא הקונסול, קריאה של כמה עמודי תיעוד (והכירות קודמת בנושאים שמסביב לתוכנות של שורות הפקודה) עזרו אותי בתשובת השאלה

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

                            yyyY מנותק
                            yyyY מנותק
                            yyy
                            כתב ב נערך לאחרונה על ידי yyy
                            #13

                            @yossiz
                            אכן מה שהביא אותי להרהר בדבר הוא תחום מערכות ההפעלה, בו למיטב זכרוני למדתי שתחום התצוגה מתוחזק בדר"כ ע"י מערכת ההפעלה ולא ע"י האפלקציה.

                            לסיכום התשובות ע"פ הקישור שהביא @Aharon-0
                            יש 2 שיטות:

                            האחת הסטנדרטית יותר היא יצירת מחלקה (בדומה אולי ל -pipe בלינוקס) שפשוט משמשת "איש באמצע" ומתעדת את כל הפניות לקונסול. (גישה זו פחות "מעניינת" בעיני כי היא בדיוק כמו יצירת מטריצת משתנים המייצגים לוח.)

                            השניה היא גישה ל-Buffer (דרך די מורכבת אם רוצים להתחיל מ-0)

                            כך או כך אין דרך מובנית לעשות זאת.

                            תגובה 1 תגובה אחרונה
                            1
                            תגובה
                            • תגובה כנושא
                            התחברו כדי לפרסם תגובה
                            • מהישן לחדש
                            • מהחדש לישן
                            • הכי הרבה הצבעות


                            בא תתחבר לדף היומי!
                            • התחברות

                            • אין לך חשבון עדיין? הרשמה

                            • התחברו או הירשמו כדי לחפש.
                            • פוסט ראשון
                              פוסט אחרון
                            0
                            • דף הבית
                            • קטגוריות
                            • פוסטים אחרונים
                            • משתמשים
                            • חיפוש
                            • חוקי הפורום