none
תוכנה שרצה ברקע בשפת c# RRS feed

  • שאלה

  • שלום

    רציתי לדעת מה אני צריך לדעת בשביל לבנות תוכנה בשפת c# שרצה ברקע ולא רואים שהיא רצה ברקע (לעשות hide ל form?) והתוכנה מאזינה לכפותרים שבמקלדת שהוא לוחץ לדוגמא: כל פעם שהוא ילחץ על ctrl+s תקפוץ הודעה וההודעה תקפוץ תמיד כשהוא ילחץ על ctrl+s מכל מקום במחשב?

    אם תוכלי לרשום לי את הקוד אני ישמח!!!

    בתודה מראש לכל העוזרים :)

    יום שישי 31 יולי 2015 05:53

תשובות

  • ערב טוב,

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

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

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

    3. הבנה מלאה של הדברים מחייבת לימוד מעמיק ומסודר ובטח לא מתאים לפורום. רוב המפתחים לא מודעים אפילו למה שקורה מאחורי הלקעים וחבל. זה הצד המעניין יותר שיכול להוביל אותנו לפיתוח נכון ואיכותי יותר. יש שני גישות שאתה יכול להתקדם בלימוד: (1) לימוד מסודר מהבסיס כולל התיאוריה וההבנה של מאחורי הקלעים (במקביל למימוש מעשי כל הזמן), כפי שנעשה למשל בלימודי תארים גבוהים בלימודי מחשבים באוניברסיטאות, אבל ניתן גם בלצע בלימוד עצמאי. או (2) פיתוח לשם הגעה לתוצאות (למשל לימוד C# בלי להבין מה קורה מאחורי הקלעים ומה המשמעות של מה שאתה עושה)... האפשרות הראשנה יכולה לקחת אותך למסלול להיות מוביל טכנולוגי, והאפשרות השנייה יכולה להוביל אותך לפתרון בעיה ספציפית יותר מהר. המוביל הטכנולוגי יוכל ללמוד כל שפה וכל טכנולוגיה מהר מאוד בהמשך ולהגיע לתוצאות טובות יותר בדרך כלל, ואפילו לתמוך בשפות שהוא לא מכיר, כי יש לו את ההבנה ולא רק הביצוע. מי שהתמקד בביצוע כניראה שיגיע למצב שהוא "רואה אפליקציה" מוכנה כפי שרצה מהר יותר. בכל מקרה תיאורטית אפשרות לעבור בין מסלולים אבל לא הרבה יבצעו זאת.

    בעקרון אתה צריך להבין כיצד עובדת מערכת ההפעלה בבסיס שלה.

    בניגוד ליישומים מבוסס MS-DOS, יישומים מבוססי Windows הם מונע אירוע (event-driven). הם לא מפעילים פנייה ישירה פונקציה (כגון בשפת C בזמן ריצה) כדי לקבל קלט. במקום זאת, הם מחכים שהמערכת תעביר קלט אליהם. לכל חלון של יישום (יישום יכול לפתוח מספר רב של חלונות) יש פונקציה בשם "window procedure". המערכת קוראת לפונקצית window procedure בכל פעם שיש להעביר קלט לחלון. פונקצית window procedure מעבדת את הקלט ומחזירה השליטה למערכת.

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

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

    בקישור הבא תוכל למצוא מדריך מאוד מאוד מאוד קצר ומקוצר של מה זה Pinvoke:
    https://msdn.microsoft.com/en-us/library/aa288468(v=vs.71).aspx

    הבעיה היא שיש אלפי מתודות מובנות במערכת ההפעלה ומייקורופט לא חושפים הכל בצורה מסודרת ולכן צריך מקום טוב בו ניתן לקבל מידע. האתר הבא הוא המקום היחיד שיש באינטרנט לידיעתי שנותן את המידע הנכון למפתחים. האתר לא נועד למי שלומד אלא לפתחים שכבר מבינים את הרעיון. האתר נותן דוגמאות מעשיות קצרות והסבר של כמה שורות על מתודות שונות שאנשים "גילו" במערכת ההפעלה עם הזמן (זה סוג של WIKI מיוחד רק לנושא Pinvoke). אין מישהו שעובד עם Pinvoke בצורה רצינית ולא מכיר את האתר. למשל אני כתבתי לך שמות של מתודות הקשורות למה שאתה צריך, באתר תוכל לראות את התבנית של המתודות האלו או לחפש אלמנטים אחרים.
    http://www.pinvoke.net/

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

    * אל תשכח לסגור את השרשור על ידי סימון התשובות והצבעה על הודעות מועילות.


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]


    • נערך על-ידי pituachMVP, Moderator יום שישי 31 יולי 2015 19:37
    • סומן כתשובה על-ידי israelbenh יום ראשון 02 אוגוסט 2015 15:06
    יום שישי 31 יולי 2015 19:24
    מנחה דיון
  • הנה דוגמה מעשית כיצד אנחנו יכולים לכתוב לחלון Notepad בעזרת Pinvoke

    זו אפליקצית CONSOLE פשוטה

    using System;
    using System.Runtime.InteropServices;
    using System.Diagnostics;
    
    
    namespace ConsoleApplication1
    {
    	class Program
    	{
    		[DllImport("user32.dll", EntryPoint = "SetWindowText")]
    		private static extern int SetWindowText(IntPtr hWnd, string text);
    
    		[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
    		private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
    
    		[DllImport("User32.dll", EntryPoint = "SendMessage")]
    		private static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
    
    		public static void ShowMessage(string message = null, string title = null)
    		{
    			Process notepad = Process.Start(new ProcessStartInfo("notepad.exe"));
    			if (notepad != null)
    			{
    				notepad.WaitForInputIdle();
    
    				if (!string.IsNullOrEmpty(title))
    					SetWindowText(notepad.MainWindowHandle, title);
    
    				if (!string.IsNullOrEmpty(message))
    				{
    					IntPtr child = FindWindowEx(notepad.MainWindowHandle, new IntPtr(0), "Edit", null);
    					SendMessage(child, 0x000C, 0, message);
    				}
    			}
    		}
    
    		static void Main(string[] args)
    		{
    			// this open Notepad with no title or content
    			ShowMessage();
    			// this open Notepad with title and content
    			ShowMessage("Ronen Ariely Content","Ronen Arely Title");
    			// we can write on notepad that is opend without open a new one, but for this we need to use Pivoke in order to find the application
    		}
    	}
    }


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]


    • נערך על-ידי pituachMVP, Moderator יום שישי 31 יולי 2015 20:08
    • סומן כתשובה על-ידי israelbenh יום ראשון 02 אוגוסט 2015 15:06
    יום שישי 31 יולי 2015 19:38
    מנחה דיון

כל התגובות

  • בוקר טוב,

    1. המטרה שלנו לעזור למפתחים ולא לקחת להם את העבודה :-)

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

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

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

    3. בוא נעבור לחלק המעשי :-) כיצד מפתחים יישום שמאזין לפעולות על המקלדת

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

    * שלב ראשון: בחירת תבנית ההתחלה איתה נעבוד.

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

    * שלב שני: עבודה עם Pinvoke

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

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

    Israel Dot NET Developers User Group (IDNDUG)

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

    SetWindowsHookEx

    UnhookWindowsHookEx

    CallNextHookEx

    GetModuleHandle

    זהו, זה כל הסיפור בעקרון בתיאוריה :-)

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

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

    ******* הנה דוגמה מעשית  ********

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

    ניתן לראות בתמונה שלושה חלונות. (1) פתחתי את תוכנת ה notepad עליה אני מבצע את הפעולות, ו(2+3) את שני היישומים שמנטרים עכבר ומקלדת בנפרד.

    ניתן לראות שכאשר אני כותב על הכתבן (notepad) היישום העליון מציג את ההקלדות על המקלדת (התמונה מראה את ההקלדות רק אחרי המילה my מכיוון שההקלדות הקודמות פשוט עלו למעשה ונעלמו מהחלון בתמונה). ניתן לראות שאחרי המילה my הקלדתי רווח->האות N->האות A... וכן הלאה. במקביל היישום השני מראה ערכי x,y של כל לחיצה על המקלדת.


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]






    יום שישי 31 יולי 2015 09:30
    מנחה דיון
  • שלוםת

    קודם כל תודה על התגובה המהירה והמפורטת.

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

    לגבי הידע שלי:

    אני יודע את הבסיס של c# כולל OO וגם טיפה winform ועוד כל מיני דברים מעבר

    את השלב הראשון אני יודע לעשות לגבי השלב השני: לא 

    תוכל להפנות אותי לאתרים שמלמדים את הנושא של החלק השני?

    ושוב תודה :)


    • סומן כתשובה על-ידי israelbenh יום ראשון 02 אוגוסט 2015 15:06
    • סימון כתשובה בוטל על-ידי pituachMVP, Moderator יום שני 12 אוקטובר 2015 18:58
    יום שישי 31 יולי 2015 13:52
  • לגבי הדוגמא המעשית שעשית אפשר לעשות שתוכנה תחזיר לnotepad אות מסוימת לדוגמא כל פעם שהמשתמש יקליד את האות a היא תחזיר לnotepad את המספר 1?
    יום שישי 31 יולי 2015 14:03
  • ערב טוב,

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

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

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

    3. הבנה מלאה של הדברים מחייבת לימוד מעמיק ומסודר ובטח לא מתאים לפורום. רוב המפתחים לא מודעים אפילו למה שקורה מאחורי הלקעים וחבל. זה הצד המעניין יותר שיכול להוביל אותנו לפיתוח נכון ואיכותי יותר. יש שני גישות שאתה יכול להתקדם בלימוד: (1) לימוד מסודר מהבסיס כולל התיאוריה וההבנה של מאחורי הקלעים (במקביל למימוש מעשי כל הזמן), כפי שנעשה למשל בלימודי תארים גבוהים בלימודי מחשבים באוניברסיטאות, אבל ניתן גם בלצע בלימוד עצמאי. או (2) פיתוח לשם הגעה לתוצאות (למשל לימוד C# בלי להבין מה קורה מאחורי הקלעים ומה המשמעות של מה שאתה עושה)... האפשרות הראשנה יכולה לקחת אותך למסלול להיות מוביל טכנולוגי, והאפשרות השנייה יכולה להוביל אותך לפתרון בעיה ספציפית יותר מהר. המוביל הטכנולוגי יוכל ללמוד כל שפה וכל טכנולוגיה מהר מאוד בהמשך ולהגיע לתוצאות טובות יותר בדרך כלל, ואפילו לתמוך בשפות שהוא לא מכיר, כי יש לו את ההבנה ולא רק הביצוע. מי שהתמקד בביצוע כניראה שיגיע למצב שהוא "רואה אפליקציה" מוכנה כפי שרצה מהר יותר. בכל מקרה תיאורטית אפשרות לעבור בין מסלולים אבל לא הרבה יבצעו זאת.

    בעקרון אתה צריך להבין כיצד עובדת מערכת ההפעלה בבסיס שלה.

    בניגוד ליישומים מבוסס MS-DOS, יישומים מבוססי Windows הם מונע אירוע (event-driven). הם לא מפעילים פנייה ישירה פונקציה (כגון בשפת C בזמן ריצה) כדי לקבל קלט. במקום זאת, הם מחכים שהמערכת תעביר קלט אליהם. לכל חלון של יישום (יישום יכול לפתוח מספר רב של חלונות) יש פונקציה בשם "window procedure". המערכת קוראת לפונקצית window procedure בכל פעם שיש להעביר קלט לחלון. פונקצית window procedure מעבדת את הקלט ומחזירה השליטה למערכת.

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

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

    בקישור הבא תוכל למצוא מדריך מאוד מאוד מאוד קצר ומקוצר של מה זה Pinvoke:
    https://msdn.microsoft.com/en-us/library/aa288468(v=vs.71).aspx

    הבעיה היא שיש אלפי מתודות מובנות במערכת ההפעלה ומייקורופט לא חושפים הכל בצורה מסודרת ולכן צריך מקום טוב בו ניתן לקבל מידע. האתר הבא הוא המקום היחיד שיש באינטרנט לידיעתי שנותן את המידע הנכון למפתחים. האתר לא נועד למי שלומד אלא לפתחים שכבר מבינים את הרעיון. האתר נותן דוגמאות מעשיות קצרות והסבר של כמה שורות על מתודות שונות שאנשים "גילו" במערכת ההפעלה עם הזמן (זה סוג של WIKI מיוחד רק לנושא Pinvoke). אין מישהו שעובד עם Pinvoke בצורה רצינית ולא מכיר את האתר. למשל אני כתבתי לך שמות של מתודות הקשורות למה שאתה צריך, באתר תוכל לראות את התבנית של המתודות האלו או לחפש אלמנטים אחרים.
    http://www.pinvoke.net/

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

    * אל תשכח לסגור את השרשור על ידי סימון התשובות והצבעה על הודעות מועילות.


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]


    • נערך על-ידי pituachMVP, Moderator יום שישי 31 יולי 2015 19:37
    • סומן כתשובה על-ידי israelbenh יום ראשון 02 אוגוסט 2015 15:06
    יום שישי 31 יולי 2015 19:24
    מנחה דיון
  • הנה דוגמה מעשית כיצד אנחנו יכולים לכתוב לחלון Notepad בעזרת Pinvoke

    זו אפליקצית CONSOLE פשוטה

    using System;
    using System.Runtime.InteropServices;
    using System.Diagnostics;
    
    
    namespace ConsoleApplication1
    {
    	class Program
    	{
    		[DllImport("user32.dll", EntryPoint = "SetWindowText")]
    		private static extern int SetWindowText(IntPtr hWnd, string text);
    
    		[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
    		private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
    
    		[DllImport("User32.dll", EntryPoint = "SendMessage")]
    		private static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
    
    		public static void ShowMessage(string message = null, string title = null)
    		{
    			Process notepad = Process.Start(new ProcessStartInfo("notepad.exe"));
    			if (notepad != null)
    			{
    				notepad.WaitForInputIdle();
    
    				if (!string.IsNullOrEmpty(title))
    					SetWindowText(notepad.MainWindowHandle, title);
    
    				if (!string.IsNullOrEmpty(message))
    				{
    					IntPtr child = FindWindowEx(notepad.MainWindowHandle, new IntPtr(0), "Edit", null);
    					SendMessage(child, 0x000C, 0, message);
    				}
    			}
    		}
    
    		static void Main(string[] args)
    		{
    			// this open Notepad with no title or content
    			ShowMessage();
    			// this open Notepad with title and content
    			ShowMessage("Ronen Ariely Content","Ronen Arely Title");
    			// we can write on notepad that is opend without open a new one, but for this we need to use Pivoke in order to find the application
    		}
    	}
    }


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]


    • נערך על-ידי pituachMVP, Moderator יום שישי 31 יולי 2015 20:08
    • סומן כתשובה על-ידי israelbenh יום ראשון 02 אוגוסט 2015 15:06
    יום שישי 31 יולי 2015 19:38
    מנחה דיון