screen capture & HOOK

itay_k

New member
screen capture & HOOK

שלום, במהלך פיתוח פרויקט כלשהו, עלי לעשות screen capture ושליחתו ללקוח (משהו כמו remote assistance). שעשיתי זאת בדרכים הרגילות (ע"י GDI,DirectX) זה היה מאוד איטי, ולקח הרבה CPU TIME. הבנתי שיש דרך לבצע זאת ע"י HOOK, נכון? חיפשתי מידע על הנושא ב-MSDN או ב- codeproject/guru אבל לא ממש מסבירים את הנושא, ולא נותנים דוגמאות שעוזרות לי. מישהו יכול להפנות אותי לאיזה מקור שיעזור לי לצורך מימוש כזה דבר? תודה מראש, איתי.
 

כאגאי

New member
מה לקח זמן?

לא נראה לי שה SCREEN CAPTURE, אלא התעבורה ברשת. נסה לפני שאתה שולח את זה להפוך אותו לקובץ JPG או PNG - המעבר הזה הוא זניח, וזה יקבץ לך את הקובץ בצורה משמעותית. חפש פרוייקטים CxImage, libpng ....
 

itay_k

New member
תאמין לי...

ניסיתי את כל האפשרויות והקיבוצים. עבדתי עם libpng, עצם העובדה שאתה שולח תמיד את כל המסך אכן מבזבז רוחב פס. אבל זה לא מה שאפריע לי, מה שאפריע זה ה-cpu. פעולת לקיחת הביטים, (getDibits אם אני זוכר נכון) ובנוסף הקיבוץ יקרים מאוד אם רוצים ממש לראות את המסך בזמן אמת (ז"א צילומים כמה פעמים בשנייה), ובנוסף שיהיה ניתן לעבוד על המחשב במקביל.
 

כאגאי

New member
אז בעצם אתה עושה מין סרט וידאו של

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

itay_k

New member
כן, מן סרט וידאו של המסך

מה שאתה אומר זה תמיד לסרוק את כל הביטים ולשלוח רק את השינויים, גם את זה ניסיתי :), אבל סריקה של 800*600 ביטים זה גם יקר... אני יודע ש-HOOK יכול לעשות את זה, כלומר לקבל את ההודעה WM_PAINT, ומשהו כזה, כמו "לדרוס" את הפונקציה onDraw, ולשלוח רק את הריבוע שהשתנה. זה מה שאני יודע בגדול, אבל אין לי מושג איך לממש את זה...
 

כאגאי

New member
הקישור הישיר לא עבד, אז

תלך לחלק של Windows Media API for Capturing the Screen בעזרת ה Windows Media Video 9 Screen :codec תוכל להמנע מאופטימיזציות למינהם ולהתרכז בעיקר. Microsoft to the rescue
 

itay_k

New member
תגובה...

כן, windows media יותר מתאים להקלטות של המסך, ולא שידור ב- real time. לגבי הקישור שנתת, המאמר הזה מודפס אצלי כבר :) אך הוא לא מספק מספיק אינפורמציה ולא יורד לעומק הדברים. שאלתי את השאלה הזאת לאחר חקירה של כל הנושא, ככה שאני מכיר את הדברים קצת..
 

DadleFish

New member
STRAMING של המסך

הוא פעולה מאוד, מאוד כבדה, שצורכת המון משאבי רשת. תוכנות מקצועיות (כמו PC ANYWHERE או VNC) עושות את זה בכלל על ידי ניחוש מבוסס של מה שקורה על המסך, ולא על ידי הפיכת העסק לסרט. גם אם היתה לך את האפשרות לקחת את המסך ולעשות ממנו סרט MPEG-2 או MPEG-4 (ואין לך את האפשרות הזו כי מדובר בפעילות מאוד תובענית ב-REALTIME), זה עדיין היה גדול מאוד. אתה צריך להוציא בסביבות ה-100KB לשניה מהמחשב. על אינטרנט אין בכלל מה לדבר, מינימום LAN ישיר שלא סובל מאיבוד פאקטות וכו' - ואני מדבר על 10FPS, שזה לא מספיק לתנועה חלקה. בקיצור, רד מזה. אין לך סיכוי לעשות את זה ככה. הדרך היחידה היא לפתח אלגוריתמים מורכבים שבוחנים את המתרחש על המסך ועושים בזה שימוש כדי לנחש מה קורה - ומדי פעם שולחים עדכון מלא של המסך לצד השני. מנסיון, תוכנות כמו VNC למשל הן לא שיא הכיף, כשאתה עומד מהצד השני ומנסה לתפעל את המחשב שמולך - ואני מדבר על עבודה ברשת פנימית, ולא אינטרנט.
 

codec

New member
לא לא לא לא לא....

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

erezsh

New member
אני חושב שהוטעת מעט

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

itay_k

New member
../images/Emo4.gif

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

codec

New member
דוגמה

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