עבור לתוכן

Timer and RunProcess on Csharp- שאלה

Featured Replies

פורסם

שלום לכולם, כתבתי קוד שאמור להריץ תוכנה כלשהי במחשב (QHOCR, זהו שם התוכנה)

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

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

יש לי 2 בעיות עיקריות.

1. ניסיתי להגדיר Timer שימתין 10 שניות אחרי הרצת התוכנה (Process.start), ורק אז יחפש את החלון של התוכנה (FindWindow). במקרה והוא לא מוצא את חלון התוכנה, יופיע MessageBox עם ההודעה -

"QHOCR is not running".

והבעיה היא: הקוד אמנם מריץ את התוכנה אבל מיד אחרי שהתוכנה נפתחת מופיע בכל זאת ה - MessageBox עם ההודעה - "QHOCR is not running", ואחרי שאני סוגרת את ה - MessageBox שקפץ , הוא מופיע שוב (בכל 10 שניות הוא מופיע, כלומר - לא הגדרתי נכון את ה Timer.. כפי הנראה, וכן כנראה יש לו בעיה עם זיהוי התוכנה שפתח.. כי ה MessageBox אמור להופיע רק אם הוא לא מצא את החלון הנדרש)

2. כמו שכתבתי קודם, אני רוצה אחרי שהתוכנה נפתחת, להגיע אל ה open שלה (שזה אפשר בעזרת Ctrl+o) ואז לכתוב את מסלול המסמך לבדיקה, לפתוח אותו לתוכנה, ולשמור אותו... בקיצור - - SendKeys. - איך אני משתמשת בזה? אני יודעת מה הפקודה הנדרשת, למשל:

;("{SendKeys.Send("{ALT , אבל לא קורה מאומה בתוכנה, משום מה... (בנוסף, איך אני שולחת

Ctrl + אות מסויימת, נניח)

שאלה אחרונה - לאחר הכל אני רוצה לסגור את התוכנה. איזו פקודה עושה את זה? (סגירת Process)

תודה על הכל, ומקווה שהבעיות היו מובנות -

עינת

[br]פורסם בתאריך: 3.09.2009 בשעה 20:29:03



private void runProcess()
{
System.Timers.Timer Timer1 = new System.Timers.Timer();
Timer1.Elapsed += new ElapsedEventHandler(RunQHOCR);
Timer1.Interval = 10000; //10 seconds

//Get image path
string imagePath = textBox1.Text;
//Get process path
string QHOCRPath = "C:/Program Files/QHOCR/qhocr.exe";
//string QHOCRPath = Application.StartupPath + @"\QHOCR.exe";
//Run the compiled process with image path as command line parameter
Process.Start(QHOCRPath);
Timer1.Start(); //Run the Timer
}

private void RunQHOCR(object source, ElapsedEventArgs e)
{
// Get a handle to the QHOCR application. The window class
// and window name were obtained using the Spy++ tool.
IntPtr QHOCRHandle = FindWindow("QWidget", "QHOCR 0.8.3-svn");

// Verify that QHOCR is a running process.
if (QHOCRHandle == IntPtr.Zero)
{
MessageBox.Show("QHOCR is not running.");
return;
}
SendKeys.Send("{ALT}");

פורסם

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

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

2. SendKeys שולח לחיצות מקשים לאפליקציה הנוכחית (את רואה שאי אפשר להעביר לו handle לאפליקציה שאת רוצה להפעיל). חוץ מזה, כאן יש הסבר על איך להשתמש בו (שימי לב להערה לגבי אפליקציות אחרות).

פורסם

שים לב שלרוב התוכנות שפותחות קבצים אפשר להעביר את שם נתיב הקובץ לפתיחה כפרמטר.

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

ארכיון

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

דיונים חדשים