locked
אפליקציה שמרחיבה את ה Clipboard RRS feed

  • שאלה

  • שלום לכולם,

    אני מעוניין לבנות האפליקציה שתעקוב אחר שינויים ב clipboard (העתקה של טקסט).

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

    "WinRT Information: The clipboard could not be accessed because the application is not in the foreground."

    אני מבין שעליי לבנות אפליקציה שתפעל כ background task.

    כיצד עליי לבנות אפליקציה כזאת שתתפוס שינויים בclipboard בזמן שהיא במצב background?

    שבת 30 נובמבר 2013 09:39

תשובות

  • מערכת ההפעלה לא מאפשרת גישה ל-clipboard כשהאפליקציה לא רצה כרגע בגלל סיבות אבטחה.

    בסה"כ לא הגיוני לאפשר לאפליקציה כלשהיא להעתיק את ססמת הבנק של המשתמש שבדיוק נמצאת ב-clipboard רק בגלל שהמשתמש התקין אותה.

    * התשובה מתייחסת לאפליקציות Windows Store בלבד. באפליקציות Desktop רגילות זה אפשרי. ראו המשך האשכול.
    • נערך על-ידי Eran Sharvit יום ראשון 01 דצמבר 2013 16:48 edited
    • סומן כתשובה על-ידי Eran Sharvit יום ראשון 01 דצמבר 2013 16:48
    שבת 30 נובמבר 2013 09:48

כל התגובות

  • מערכת ההפעלה לא מאפשרת גישה ל-clipboard כשהאפליקציה לא רצה כרגע בגלל סיבות אבטחה.

    בסה"כ לא הגיוני לאפשר לאפליקציה כלשהיא להעתיק את ססמת הבנק של המשתמש שבדיוק נמצאת ב-clipboard רק בגלל שהמשתמש התקין אותה.

    * התשובה מתייחסת לאפליקציות Windows Store בלבד. באפליקציות Desktop רגילות זה אפשרי. ראו המשך האשכול.
    • נערך על-ידי Eran Sharvit יום ראשון 01 דצמבר 2013 16:48 edited
    • סומן כתשובה על-ידי Eran Sharvit יום ראשון 01 דצמבר 2013 16:48
    שבת 30 נובמבר 2013 09:48
  • תודה על התשובה.

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

    שבת 30 נובמבר 2013 15:05
  • 1. השאלה לא קשורה לפורום של win 8 store בפרט אלא פשוט לכתיבת קוד ב C# בכלל.

    2. אני לא מבין מה ההגדרה שלך ל "כאשר האפליקציה לא פתוחה"

    מה ז"א אומרת "אפליקציה פתוחה" או לא?!? אפליקציה יכולה לרוץ או לא. אם היא לא רצה זה כאילו היא לא קיימת. זה לא אפליקציה אלא סתם קובץ או קוד. אם היא רצה אז היא יכולה לבצע מה שאתה רוצה.

    * יכול להיות ש"פתוחה" אתה מתכוון ל"טופס ניראה"?!?
    ז"א אם אם אין GUI אתה חושב שהיא לא פתוחה?

    3. לשם המשך ההסבר אני אניח שהאפליקציה רצה (אחרת כמובן היא לא קיימת).

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

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

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

    * בזמן האירוע או בתיזמון שקבעת פשוט תקרא את הטקסט מה clipboard ישירות על ידי:

    System.Windows.Forms.DataObject c = (System.Windows.Forms.DataObject)Clipboard.GetDataObject();
    Console.WriteLine(c.GetText());

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

    באותה צורה אתה יכול לכתוב ל clipboard כל טקסט שאתה רוצה:

    Clipboard.SetText("Yes I Can");

    כמו שאתה רואה זה מאוד פשוט.

    * יש אפשרות גם לעבוד ישירות עם רכיבי ה COM של C++ דרך C# על ידי הוספת DLL חיצוני. זה יותר מורכב אבל לפעמים יותר יעיל וגמיש. למשל תוכל לצרף את המתודות הבאות של רכיבי ה COM לקוד שלך ואז תוכל להישתמש בהם בקוד עצמו:

            [DllImport("user32.dll")]
            internal static extern bool OpenClipboard(IntPtr hWndNewOwner);
    
            [DllImport("user32.dll")]
            internal static extern bool CloseClipboard();
    
            [DllImport("user32.dll")]
            internal static extern bool SetClipboardData(uint uFormat, IntPtr data);
    
            [DllImport("user32.dll")]
            internal static extern bool EmptyClipboard();
            
            [DllImport("user32.dll")]
            internal static extern bool GetClipboardData(uint uFormat);

    אני מקווה שזה נותן לך את מה שיפשת :-)


    [Personal Site] [Blog] [Facebook]signature

    • נערך על-ידי pituachMVP שבת 30 נובמבר 2013 16:29
    שבת 30 נובמבר 2013 16:21
  • התשובה היא כן, ברור שאפשר! אתה לא מכיר תוכנות כאלה? יש הרבה תוכנות מעקב אחרי הקלדה וזה אומר שאפשר. גם מה שרצית קודם אפשר לבצע בקלות. התשובה היא תמיד כן. במחשבים הכל אפשר וצריך רק ידע / יכולת. אם אתה לא יכול אז מישהו אחר יכול. זה הכלל :-)

    ראה דוגמה והסבר שצירפתי לבעיה המקורית


    [Personal Site] [Blog] [Facebook]signature

    • נערך על-ידי pituachMVP שבת 30 נובמבר 2013 16:46
    שבת 30 נובמבר 2013 16:46
  • pituach,

    השאלה נשאלה בפורום פיתוח Windows Store Apps ל-Windows 8, זו עד כמה שאני מבין הסביבה אליה מכוון awaken1. כש-awaken1 רשם שהוא רוצה לדעת אם ניתן לגשת ל-clipboard כשהאפליקציה לא ב-foreground, הוא התכוון למצב בו האפליקציה נמצאת במצב של Suspended, בו הקוד של ה-GUI לא רץ, וניתן להריץ רק BackgroundTask. מתוך BackgroundTask לא ניתן להבנתי לגשת ל-clipboard. אם אני טועה בדרישה awaken1, אנא תקן אותי.

    דוגמאות הקוד שנתת הן נכונות לסביבת הדסקטופ, אך עד כמה שאני יודע לא יעבדו בתוך אפליקציית Windows Store Apps. 

    ללא קשר, אנא נסה למתן את הטון בתגובות בפורום זה.

    שבת 30 נובמבר 2013 22:43
  • אנא נסה למתן את הטון בתגובות בפורום זה.

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

    מערכת ההפעלה לא מאפשרת גישה ל-clipboard כשהאפליקציה לא רצה כרגע בגלל סיבות אבטחה.

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

    בסה"כ לא הגיוני לאפשר לאפליקציה כלשהיא להעתיק את ססמת הבנק של המשתמש שבדיוק נמצאת ב-clipboard רק בגלל שהמשתמש התקין אותה.

    בהחלט הגיוני ולזה נועד ה clipboard. אני כל שהזמן מבצע את זה (וכמוני אחרים כניראה). אני למשל שומר ססמאות בתוכנת ססמאות מיוחדת, כל פעם שאני צריך ססמה אני מעתיק אותה לזכרון ומדביק אותה בכל אפליקציה שאני רוצה (שמאפשרת זאת), כולל כמובן win store. אם אתה רושם ססמת בנק באפליקציה אז היא לא נכנסת ל clipboard לבד! זו פירצת אבטחה אולי אם מעבירים אותה לשם, אבל זה כבר קשור לפיתוח של האפליקציה של הבנק, או למשתמש. ההקלדה של טקסט לא מכניסה אותו לזכרון בברירת המחדל. האפליקציה יכולה להכניס את הטקסט לזכרון בצורה יזומה,או המשתמש יכול לבצע זאת בצורה יזומה (למשל ctrl+c).


    [Personal Site] [Blog] [Facebook]signature

    • נערך על-ידי pituachMVP יום ראשון 01 דצמבר 2013 02:15
    יום ראשון 01 דצמבר 2013 02:01
  • אהלן awaken1

    תבדוק אם הפרוייקט הבא עוזר לך אולי

    Clipboard app sample

    http://code.msdn.microsoft.com/windowsapps/Clipboard-App-sample-309ec122

    כמו כן הקישור הבא אמור לעזור לך כניראה גם לשאלה ההמשך:

    http://msdn.microsoft.com/en-us/library/windows/apps/hh977058.aspx

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

    בהצלחה


    [Personal Site] [Blog] [Facebook]signature

    • נערך על-ידי pituachMVP יום ראשון 01 דצמבר 2013 02:14
    יום ראשון 01 דצמבר 2013 02:04

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

    אם כך חוסר ההבנה היה בצד שלי. מאחורינו. :-)

    תבדוק אם הפרוייקט הבא עוזר לך אולי

    Clipboard app sample

    http://code.msdn.microsoft.com/windowsapps/Clipboard-App-sample-309ec122

    כמו כן הקישור הבא אמור לעזור לך כניראה גם לשאלה ההמשך:

    http://msdn.microsoft.com/en-us/library/windows/apps/hh977058.aspx

    שילוב של 2 דוגמאות הקוד שנתת (הרצת דומאת ה-cliboard בתוך background task) בדיוק ימחיש את ה-exception שהוא קיבל.

    צריך לזכור שלמרות שאכן ניתן לעשות זאת בסביבת הדסקטופ הרגילה, שם ניתן לכתוב גם key loggers למינהם, בסביבת ה-Windows Store Apps הכוונה של מייקרוסופט הייתה לייצר מנגנון בטוח יותר עבור המשתמש. זה גם למה יכולת רגישה כמו כתיבה וקריאה של ה-clipboard לא אמורה להיות נגישה לאפליקציה שלא רצה כרגע ב-Foreground.

    יום ראשון 01 דצמבר 2013 05:20
  • אם לא הובן, אז בשביל לסכם את הנושא: ניתן לבצע את זה גם באפליקציית win store ובכל סוג אפליקציה (בחלק זה יותר מובנה ובחלק צורך יותר עבודה).

    כאמור ניתן לבצע כל מה שרוצים אם יש את הידע והיכולת. אם מאוד רוצים אפשר גם לבצע override לאלמנטים שונים ולשנות התנהגות, או להחליף מחלקות... כן... גם אתהתנהגות מערכת ההפעלה ניתן לשנות... לא תמיד צריך לתבסס על copy/paste או גרירת אלמנטים עם העכבר :-)

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

    אני מקווה שזה עונה על הצרכים שלך awaken1
    כאמור אם עולה שאלה נוספת תרגיש חופשי לפרט :-)


    [Personal Site] [Blog] [Facebook]signature

    יום ראשון 01 דצמבר 2013 05:53
  • תודה לכולם על העזרה והתשובות. אכן אין בעיה לכתוב תוכנית דסקטופית שתאזין ל-clipboard ברקע. יש לא מעט תוכנות כאלה שמטרתן לשמור ערכים ישנים שהמשתמש עשה להם copy כדי שיוכל לשחזרם ולא רק את הערך האחרון שהעתיק. אבל דווקא בחנות לא מצאתי אפליקציה כזאת. כל האפליקציות clipboard שראיתי היו חייבות להיות פתוחה במצב Foreground על מנת שיעבדו.

    את האפליקציה שלי אני מעדיף לכתוב בשפת javascript ולהשתמש בAPI מיוחד של מייקרוסופט כדי לגשת לנתוני המערכת. אני משער (לא בדקתי) שגם בכתיבת אפליקציות בשפת C# מייקרוסופט מדריכים להשתמש ב API מיוחדים לגישה לנתוני מערכת.

    אין לי בעיה לכתוב את האפליקציה מחדש ב C# אם אגלה ששימוש בכלים מסורתיים של C# ו- C++ (ללא שימוש ב API מיוחד שמיועד לפיתוח אפליקציות חנות) אכן יאפשר לי לגשת לcliboard כאשר האפליקציה במצב Suspended.

    יום ראשון 01 דצמבר 2013 06:10

  • כאמור ניתן לבצע כל מה שרוצים אם יש את הידע והיכולת.

    עונה על ההגדרה של בעיה בטון הוירטואלי...

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

    לא קראת את מה שרשמתי - לא מהווה חלק מהתשובה, אלא חלק מהבעיה. נסה לשלב קריאה ל-Clipboard.GetContent (מהלינק הראשון) מתוך BackgroundTask (מהלינק השני) וראה מה קורה.

    לגבי קריאה לרכיבי COM ע"י DllImport, גם היא מוגבלת, ראה כאן:

    http://msdn.microsoft.com/en-us/library/windows/apps/br205762.aspx

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

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

    יום ראשון 01 דצמבר 2013 10:05
  • תודה לכולם על העזרה והתשובות. אכן אין בעיה לכתוב תוכנית דסקטופית שתאזין ל-clipboard ברקע. יש לא מעט תוכנות כאלה שמטרתן לשמור ערכים ישנים שהמשתמש עשה להם copy כדי שיוכל לשחזרם ולא רק את הערך האחרון שהעתיק. אבל דווקא בחנות לא מצאתי אפליקציה כזאת. כל האפליקציות clipboard שראיתי היו חייבות להיות פתוחה במצב Foreground על מנת שיעבדו.

    את האפליקציה שלי אני מעדיף לכתוב בשפת javascript ולהשתמש בAPI מיוחד של מייקרוסופט כדי לגשת לנתוני המערכת. אני משער (לא בדקתי) שגם בכתיבת אפליקציות בשפת C# מייקרוסופט מדריכים להשתמש ב API מיוחדים לגישה לנתוני מערכת.

    אין לי בעיה לכתוב את האפליקציה מחדש ב C# אם אגלה ששימוש בכלים מסורתיים של C# ו- C++ (ללא שימוש ב API מיוחד שמיועד לפיתוח אפליקציות חנות) אכן יאפשר לי לגשת לcliboard כאשר האפליקציה במצב Suspended.

    זה לא משנה באיזו שפה תכתוב, כולן נגישות לאותו API של WinRT. אין ספק שב-C# ו-++C תוכל לכתוב קוד "מתוחכם" יותר, אבל זה לא ישנה את רמת הנגישות ל-clipboard כשהאפליקציה במצב של Suspended.

    במידה והאפליקציה שלך לא מיועדת להעלאה ל-Store, ניתן לחשוב על מספר פתרונות היברידיים המשלבים אפליקציית דסקטופ שעושה את מה ש-pituach הציע ואפליקציית Windows Store App שמתקשרת איתה:

    http://stackoverflow.com/questions/7465517/how-can-a-metro-app-in-windows-8-communicate-with-a-backend-desktop-app-on-the-s/9373726#9373726

    אבל שוב, זה לא יאושר להעלאה ל-Store.

    יום ראשון 01 דצמבר 2013 10:16
  • awaken1, זו נקודה ספציפית מאוד חשובה ונכונה שאלעד מעלה: מגבלות של הרשאות של שירות חיצוני.

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

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

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


    [Personal Site] [Blog] [Facebook]signature

    יום ראשון 01 דצמבר 2013 14:00