עזרה בשיפור סקריפט שבניתי לעבודה עם AutoIt3

פורום רשתות, IT ומחשוב כללי - רשתות, ראוטרים, מחשבים ניידים, אביזרים וכו'.
שלח תגובה
gil900 פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1151
הצטרף: אוקטובר 2009
נתן תודות: 15 פעמים
קיבל תודות: 19 פעמים

שליחה #1 

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

קוד: בחירת הכל

MouseClick("left", X, Y, 2, 1)
שבמקום ה X וה Y יש את המספרים של נקודות המיקום
החיסרון פה הוא שהחלון בתוכנה צריך להיות במיקום ספציפי והרזולוציה צריכה להיות רזולוציה שמתאימה לסקריפט
בגלל שזה עובד על סמך נקודות ציון

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

אם כן אז מה מבנה הפקודה לזה?

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

איך עושים את זה?

uriler
סמל אישי של משתמש
חבר במועדון 10K
חבר במועדון 10K
תגובות: 10118
הצטרף: פברואר 2005
שם מלא: אורי לרנר
מיקום: חולון
נתן תודות: 190 פעמים
קיבל תודות: 512 פעמים
יצירת קשר:

שליחה #2 

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

לכל כפתור, checkbox, שדה וכו' בכל חלון יש הגדרת ControlID ופעולות שניתן לשלוח אליו. אתה יכול לזהות את ה ControlID באמצעות כלי העזר של AutoIt, אותו כלי עזר שמאפשר לזהות שמות של חלונות לצורך פקודות WinClose וכו'.
במקום לשלוח את העכבר לנקודה ואז שליחת לחיצה שמאלית, פשוט תשלח לחיצה ל ControlID המתאים באמצעות ControlClick.

gil900 פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1151
הצטרף: אוקטובר 2009
נתן תודות: 15 פעמים
קיבל תודות: 19 פעמים

שליחה #3 

מצאתי את הפקודה הזאת:
ControlClick ( "title", "text", controlID [, button [, clicks [, x [, y ]]]] )

אם אני אמלא רק את המספרים של ה X וה Y ואת ה title וה clicks אז זה יצא כמו שאני רוצה שזה יהיה נקודות ציון שתלויות בגודל החלון(נקודות ציון של החלון) ?

uriler
סמל אישי של משתמש
חבר במועדון 10K
חבר במועדון 10K
תגובות: 10118
הצטרף: פברואר 2005
שם מלא: אורי לרנר
מיקום: חולון
נתן תודות: 190 פעמים
קיבל תודות: 512 פעמים
יצירת קשר:

שליחה #4 

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

gil900 פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1151
הצטרף: אוקטובר 2009
נתן תודות: 15 פעמים
קיבל תודות: 19 פעמים

שליחה #5 

uriler כתב:לא מאמין, קואורדינטות זה עניין אוניברסלי.
למה אתה לא מנסה מה שהצעתי?
...
כי בדרך שלך זה יקח יותר זמן ויש דברים שקשה לי להאמין שיש להם תחליף יותר טוב להזזת העכבר

uriler
סמל אישי של משתמש
חבר במועדון 10K
חבר במועדון 10K
תגובות: 10118
הצטרף: פברואר 2005
שם מלא: אורי לרנר
מיקום: חולון
נתן תודות: 190 פעמים
קיבל תודות: 512 פעמים
יצירת קשר:

שליחה #6 

gil900 כתב:
uriler כתב:לא מאמין, קואורדינטות זה עניין אוניברסלי.
למה אתה לא מנסה מה שהצעתי?
...
כי בדרך שלך זה יקח יותר זמן ויש דברים שקשה לי להאמין שיש להם תחליף יותר טוב להזזת העכבר
...
זכותך, אבל כפי שציינת לקואורדינטות יש בעיה בגלל מיקום חלון, רזולוציה וכו'.
כשכתבתי סקריפטים הפעולה היחידה עבורה לא היה תחליף ל Mouse commands הייתה גרירה והזזה של חלונות או אייקונים.

gil900 פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1151
הצטרף: אוקטובר 2009
נתן תודות: 15 פעמים
קיבל תודות: 19 פעמים

שליחה #7 

uriler כתב:
gil900 כתב:
uriler כתב:לא מאמין, קואורדינטות זה עניין אוניברסלי.
למה אתה לא מנסה מה שהצעתי?
...
כי בדרך שלך זה יקח יותר זמן ויש דברים שקשה לי להאמין שיש להם תחליף יותר טוב להזזת העכבר
...
זכותך, אבל כפי שציינת לקואורדינטות יש בעיה בגלל מיקום חלון, רזולוציה וכו'.
כשכתבתי סקריפטים הפעולה היחידה עבורה לא היה תחליף ל Mouse commands הייתה גרירה והזזה של חלונות או אייקונים.
...
אוקי אז אני אשתמש בפקודה הזאת:
WinMove ( "title", "text", x, y [, width [, height[, speed]]] )

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


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

uriler
סמל אישי של משתמש
חבר במועדון 10K
חבר במועדון 10K
תגובות: 10118
הצטרף: פברואר 2005
שם מלא: אורי לרנר
מיקום: חולון
נתן תודות: 190 פעמים
קיבל תודות: 512 פעמים
יצירת קשר:

שליחה #8 

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

אין לי בעיה לעזור לך עם זיהוי ה title, אבל זה תכנות עקום לחלוטין ביחס לשימוש בשליחת controlclick.

gil900 פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1151
הצטרף: אוקטובר 2009
נתן תודות: 15 פעמים
קיבל תודות: 19 פעמים

שליחה #9 

uriler כתב:אני לא מבין - אתה מתכוון להזיז את החלון ממקום למקום ואז לשלוח את העכבר? ומה אם הרזולוציה תשתנה או שמסיבה מסוימת גודל החלון יהיה שונה מאשר בפעם שעברה בה התוכנה נפתחה?

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

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

חוץ מזה איזושהי פעולה שלא נראה לי ש CONTROLCLICK יוכל לבצע ואני לא בטוח בזה

עריכה:
בדקתי את השאלה הזאת:
מצאתי את הפקודה הזאת:
CODE] ControlClick ( "title", "text", controlID [, button [, clicks [, x [, y ]]]] ) ]

אם אני אמלא רק את המספרים של ה X וה Y ואת ה title וה clicks אז זה יצא כמו שאני רוצה שזה יהיה נקודות ציון שתלויות בגודל החלון(נקודות ציון של החלון) ?
...
ולפי הנסיון התשובה היא כן!!

זה עובד

ניסיתי את הפקודה הזאת:

קוד: בחירת הכל

ControlClick( "Untitled - Notepad", "", "", "left", "1", 530, 208)
על מסמך הטקסט אחרי שמיליתי את כולו ברווחים כדי שאוכל לראות את המיקום של הלחיצה וזה עבד בדיוק כמו שרציתי!
גם כשהזזתי את החלון ושיניתי את הרזולוציה המיקום בחלון נשאר קבוע

וזה כמו שציפיתי

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

אני רק צריך שתעזור לי למצוא את ה title וזה

gil900 פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1151
הצטרף: אוקטובר 2009
נתן תודות: 15 פעמים
קיבל תודות: 19 פעמים

שליחה #10 

אוקי אז ככה

אני שואף לפיתוח של משהו יותר מתקדם שיעבוד עם קובץ INI הבא

הקובץ INI מכיל את התאריך

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

קוד: בחירת הכל

[WORKFORMESETTINGS]
DATA=The DATA
כך שכל פעם שהסקריפט יקליד את התאריך הוא יעתיק את התאריך מקובץ ה INI וכך הבעיה תיפתר
כל יום אני אעדכן את קובץ ה INI וכתוצאה מכך נסקריפט יכתוב את התאריך העדכני

זה מה שפיתחתי עד עכשיו:

קוד: בחירת הכל

ControlClick("[CLASS:ui23Drawn_W32; INSTANCE:8]", "", "1", "left", "2", 632, 27)
sleep(250)
send("{0}")
send("{1}")
send("{0}")
send("{1}")
send("{0}")
send("{0}")
send("{0}")
send("{0}")
send("{2}")
send("{0}")
sleep(250)
ControlClick("[CLASS:ui23Drawn_W32]", "", "1", "left", "2", 516, 64)
send("{י}")
sleep(250)
ControlClick("[CLASS:ui23Drawn_W32; INSTANCE:9]", "", "1", "left", "2", 122, 387)
sleep(250)
send("{?????}") **********> INI פה חסרה פקודה שתשלח תאריך מקובץ 
sleep(250)
ControlClick("[CLASS:ui23Drawn_W32; INSTANCE:9]", "", "1", "left", "1", 93, 88)
sleep(250)
send("{enter}")
sleep(1000)
ControlClick("[CLASS:ScrollBar; INSTANCE:1]", "", "1", "left", "1", 174, 4)
sleep(50)
ControlClick("[CLASS:Edit; INSTANCE:11]", "", "1", "left", "1", 81, 8)
sleep(250)
ControlClick("[CLASS:Edit; INSTANCE:10]", "", "1", "left", "1", 81, 8)
sleep(100)
send("{f7}")
sleep(50)
send("{f7}")
sleep(50)
send("{f8}")
בקוד סימנתי את השורה החסרה שבה אני מבקש את הקוד הזה שישלח את התאריך מקובץ ה INI

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

מה שאני רוצה זה שתצטרף לסקריפט פעולה נוספת והיא העתקת האסמכתא לפנקס טקסט
מהי הפקודה לזה?

חיפשתי בגוגל ובקובץ העזרה ולא הצלחתי להבין את זה

תודה לעוזרים

Ariky
סמל אישי של משתמש
חבר פעיל מאוד
חבר פעיל מאוד
תגובות: 222
הצטרף: אפריל 2009
נתן תודות: 7 פעמים
קיבל תודות: 15 פעמים

שליחה #11 

אני לא מכיר את התוכנה שאתה משתמש כדי לרשום את ה script
אבל
למה אתה צריך לרשום את ה תאריך ב INI
אתה יכול להשתמש בפקודה מובנת בשפה
חיפוש קטן בגוגל וזה מה שמצאתי
בדוק אם זה מתאים לך
http://www.autoitscript.com/forum/topic ... -function/

ואם זה לא מתאים לך תנסה את ה FileOpen
http://www.autoitscript.com/autoit3/doc ... leOpen.htm

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

gil900 פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1151
הצטרף: אוקטובר 2009
נתן תודות: 15 פעמים
קיבל תודות: 19 פעמים

שליחה #12 

Ariky כתב:אני לא מכיר את התוכנה שאתה משתמש כדי לרשום את ה script
אבל
למה אתה צריך לרשום את ה תאריך ב INI
אתה יכול להשתמש בפקודה מובנת בשפה
חיפוש קטן בגוגל וזה מה שמצאתי
בדוק אם זה מתאים לך
http://www.autoitscript.com/forum/topic ... -function/

ואם זה לא מתאים לך תנסה את ה FileOpen
http://www.autoitscript.com/autoit3/doc ... leOpen.htm

ואם הבנתי אותך נכון אתה רוצה לרשום את האסמכתא לתוך קובץ
אז בשביל זה ה FileOpen מתאים לך
תראה איך אתה פותח את הקובך לצורך כתיבה
ומוסיף לו שורה
...
תודה אבל לפעמים אני עושה דוחות של תאריך אחר ולכן אני רוצה תמיד לרשום את התאריך בקובץ INI

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

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

כמו שיש פקודה שמעדכנת קובץ INI מבלי לפתוח אותו ככה אני רוצה פקודה כזאת

uriler
סמל אישי של משתמש
חבר במועדון 10K
חבר במועדון 10K
תגובות: 10118
הצטרף: פברואר 2005
שם מלא: אורי לרנר
מיקום: חולון
נתן תודות: 190 פעמים
קיבל תודות: 512 פעמים
יצירת קשר:

שליחה #13 

למה שלא תפתח תיבת בקשה לתאריך תו"כ הרצת הסקריפט?
אם אתה כבר מריץ אותו ידנית שיבצע את הפעולה, תקליד לתוכו את התאריך במקום לקובץ ה INI (למיטב הבנתי, זה לא שה INI מקבל את התאריך אוטומטית).
למשל, אתה יכול להכניס את התאריך לתוך המשתנה Data באמצעות הפקודה הבאה -

קוד: בחירת הכל

$data = InputBox("Enter Something", "Enter some data in the field below.")
זה יפתח חלון עם הכותרת Enter something ובפנים יהיה הטקסט השני צמוד לשדה הזנה.


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

gil900 פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1151
הצטרף: אוקטובר 2009
נתן תודות: 15 פעמים
קיבל תודות: 19 פעמים

שליחה #14 

uriler כתב:למה שלא תפתח תיבת בקשה לתאריך תו"כ הרצת הסקריפט?
אם אתה כבר מריץ אותו ידנית שיבצע את הפעולה, תקליד לתוכו את התאריך במקום לקובץ ה INI (למיטב הבנתי, זה לא שה INI מקבל את התאריך אוטומטית).
למשל, אתה יכול להכניס את התאריך לתוך המשתנה Data באמצעות הפקודה הבאה -

קוד: בחירת הכל

$data = InputBox("Enter Something", "Enter some data in the field below.")
זה יפתח חלון עם הכותרת Enter something ובפנים יהיה הטקסט השני צמוד לשדה הזנה.


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

קוד: בחירת הכל

send("{$data}")
?

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

gil900 פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1151
הצטרף: אוקטובר 2009
נתן תודות: 15 פעמים
קיבל תודות: 19 פעמים

שליחה #15 

בבקשה רק תענה על זה

איך אני עושה שהסקריפט יקליד את הנעלם $data ?
ניסיתי
send("{$data}")

אבל הוא פשוט הקליד $data
ולא את התאריך שהזנתי

uriler
סמל אישי של משתמש
חבר במועדון 10K
חבר במועדון 10K
תגובות: 10118
הצטרף: פברואר 2005
שם מלא: אורי לרנר
מיקום: חולון
נתן תודות: 190 פעמים
קיבל תודות: 512 פעמים
יצירת קשר:

שליחה #16 

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

gil900 פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1151
הצטרף: אוקטובר 2009
נתן תודות: 15 פעמים
קיבל תודות: 19 פעמים

שליחה #17 

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

כבר עשיתי כמה טסטים וראיתי שיש ממה לעבוד

עריכה:

אני רק לא יודע איך להכניס Func בתוך Func
סתם עשיתי ניסיון שהכנסתי איזה קוד Func ואני מקבל הודעת שגיאה
סתכל:
http://img852.imageshack.us/img852/401/98331265.png

איך עושים את זה נכון?

עריכה:

הסתדרתי סופית
הסקריפט בשלבי סיום
יש לו 215 שורות קוד

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

עריכה:
הסקריפט מוכן סופית
תוצאה:
http://img196.imageshack.us/img196/3024/76960256.png

פשוט ענקקקקק

שלח תגובה

חזור אל “רשתות, אינטרנט ו- Fiber”