ABA


"לעשות INVOKE לOK דרך Win32 API"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15951 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15951
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   21:37   17.06.10   
אל הפורום  
  לעשות INVOKE לOK דרך Win32 API  
 
   אני מעוניין לעשות שאני יוכל לעשות OK על חלון אחר דרך התוכנית שלי..
חרשתי את האינטרנט ולא הצלחתי למצוא דרך לגשת לקונטרול OK..
מישהו אולי יודע איך אני עושה את זה?


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  אתה צריך להשיג את ה HWND שלו ולעשות לו POSTMESSAGE Net_Boy  17.06.10 23:35 1
     אפשר דוגמת קוד? ronen333  18.06.10 00:52 2
         העלתי לך דוגמא ב C++ Net_Boy  18.06.10 10:49 3
             אני אבדוק, תודה :) ronen333  18.06.10 11:08 5
             איי חשבתי שעובד בסוף לא ronen333  18.06.10 14:56 8
                 עשיתי כך: ronen333  18.06.10 16:34 9
     כתבתי את הדבר הבא ronen333  18.06.10 11:07 4
         פתח MSDN ותחפש WH_COMMAND, יהיה לך פירוט Sn00py  18.06.10 11:31 6
             לא כל כך הבנתי את הREMARKS שלהם ronen333  18.06.10 14:36 7
                 אתה צריך לשלוח ב WPARAM את הקבוע IDOK Net_Boy  18.06.10 17:08 10
                     לא פועל אחי... ronen333  18.06.10 18:06 11
  תודה רבה לעומר על העזרה :) ronen333  18.06.10 21:17 12

       
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק, 2 נקודות
   23:35   17.06.10   
אל הפורום  
  1. אתה צריך להשיג את ה HWND שלו ולעשות לו POSTMESSAGE  
בתגובה להודעה מספר 0
 
   להודעת WM_COMMAND עם IDOK


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   00:52   18.06.10   
אל הפורום  
  2. אפשר דוגמת קוד?  
בתגובה להודעה מספר 1
 
   בערך כל שפה תיהיה בסדר אני רק רוצה פחות או יותר להבין...
וגם אשמח לראות את הקבוע שאתה משתמש (במספר).


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק, 2 נקודות
   10:49   18.06.10   
אל הפורום  
  3. העלתי לך דוגמא ב C++  
בתגובה להודעה מספר 2
 
   תפתח את ה SLN של Win32Dialog

הפרויקט השני הוא פרויקט שפשוט סוגר את הפרויקט הראשון ע"י שליחת IDOK לחלון הראשון אז תעיין בקוד מקור שבו

ואם יש שאלות תרגיש חופשי


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   11:08   18.06.10   
אל הפורום  
  5. אני אבדוק, תודה :)  
בתגובה להודעה מספר 3
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   14:56   18.06.10   
אל הפורום  
  8. איי חשבתי שעובד בסוף לא  
בתגובה להודעה מספר 3
 
   ערכתי לאחרונה בתאריך 18.06.10 בשעה 15:19 בברכה, ronen333
 
:(

לא הבנתי למה אמרת שאני צריך PostMessage..
במה שהבאת לי אתה משתמש בפונקציה EndDialog(hWnd, 0) וזהו..
השתמשתי בזה אבל זה זורק לי אקספשן...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   16:34   18.06.10   
אל הפורום  
  9. עשיתי כך:  
בתגובה להודעה מספר 8
 
   ערכתי לאחרונה בתאריך 18.06.10 בשעה 16:39 בברכה, ronen333
 
תשמע ניסתי לעשות את הOK דרך הWIN API וזה לא הצליח..
אני משתמש בPostMessage כדי לגלות שזה אכן דיאלוג בוקס עם הקבוע WM_COMMAND כפי שאמרת.
ואז הפעלתי את הEndDialog כפי שאתה השתמשת בקוד שלך..

זה הקוד שכתבתי:


[DllImport("user32.dll", SetLastError = true)]
static extern bool PostMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
static extern bool EndDialog(IntPtr hDlg, IntPtr nResult);

const int WM_COMMAND = 0x0111;

public static void InvokeOKToTopWindow()
{
hWnd = GetForegroundWindow();
if (hWnd == IntPtr.Zero)
throw new Exception("Couldn't find window!");

bool r = PostMessage(hWnd, WM_COMMAND, IntPtr.Zero, IntPtr.Zero);
if (r)
{
EndDialog(hWnd, IntPtr.Zero);
}


}


וזה זורק לי אקספשן:

---------------------------

---------------------------
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

at SVR.Win32API.EndDialog(IntPtr hDlg, IntPtr nResult)

at SVR.Win32API.InvokeOKToTopWindow() in C:\Users\Aviad\Documents\Visual Studio 2010\Projects\SVR\SVR\Classes\Win32API.cs:line 108



אשמח אם תסביר לי מה לא בסדר ואיך אני אמור לעשות את זה..
תודה רבה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   11:07   18.06.10   
אל הפורום  
  4. כתבתי את הדבר הבא  
בתגובה להודעה מספר 1
 
  


static extern bool PostMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

const uint WM_COMMAND = 0x0111;
public static void InvokeOKToTopWindow()
{
hWnd = GetForegroundWindow();
if (hWnd == IntPtr.Zero)
throw new Exception("Couldn't find window!");
PostMessage(hWnd, WM_COMMAND, wParam, lParam);

}


מה לשלוח כwParam וlParam?
אפס?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות, דרג אמינות חבר זה
   11:31   18.06.10   
אל הפורום  
  6. פתח MSDN ותחפש WH_COMMAND, יהיה לך פירוט  
בתגובה להודעה מספר 4
 
  

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   14:36   18.06.10   
אל הפורום  
  7. לא כל כך הבנתי את הREMARKS שלהם  
בתגובה להודעה מספר 6
 
   ערכתי לאחרונה בתאריך 18.06.10 בשעה 14:55 בברכה, ronen333
 


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק, 2 נקודות
   17:08   18.06.10   
אל הפורום  
  10. אתה צריך לשלוח ב WPARAM את הקבוע IDOK  
בתגובה להודעה מספר 7
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   18:06   18.06.10   
אל הפורום  
  11. לא פועל אחי...  
בתגובה להודעה מספר 10
 
  

public static void InvokeOKToTopWindow()
{
hWnd = GetForegroundWindow();
if (hWnd == IntPtr.Zero)
throw new Exception("Couldn't find window!");

PostMessage(hWnd, WM_COMMAND, (IntPtr)IDOK, IntPtr.Zero);


}


ראיתי בתיעוד בתוכנית C++ שלך שIDOK זה 1.. אז שמתי אותו כקבוע 1.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   21:17   18.06.10   
אל הפורום  
  12. תודה רבה לעומר על העזרה :)  
בתגובה להודעה מספר 0
 
   מסתבר שהפקודה כן עובדת אבל לא על כל חלון דיאלוג, ולכן הוספתי פקודה של QUIT במקרה וזה לא מצליח.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net