פורסם 2008 בנובמבר 1117 שנים שלום לכולם, השפה שאני משתמש בה זה VB .net , אני מנסהלהישתמש בSendinput API בשביל להישתמש בגלגלת של העכבר לגלול למטה ולמעלה,אבל יש לי בעיה מסויימת, ממה שהבנתי Windows Vista 64bit או ניראה לי שגם בכללי מערכות 64 ביט,פשוט לא מבצעות את הפעולה, קראתי על אפשרות לעשות Compile לתוכנה ישירות ל-32 אבל אני רוצהלהשאיר את האפשרות הזו אחרונה...הינה הקוד: <DllImport("user32.dll", SetLastError:=True)> Private Shared Function SendInput(ByVal cInputs As Integer, ByRef pInputs As MOUSEINPUT, ByVal cbSize As Integer) As Integer End Function ''Mouse Input Const INPUT_MOUSE = 0 ''1 Scroll Const WHEEL_DELTA = 120 ''Mouse Scroll Event Const MOUSEEVENTF_WHEEL = &H800 ''Scroll direction for MouseScroll function Public Enum SCROLLDIRECTION scrollUp = WHEEL_DELTA scrollDown = -120 End Enum ''Structure for the sendinput API Private Structure MOUSEINPUT Public dwType As Integer Public dx As Integer Public dy As Integer Public mouseData As Integer Public dwFlags As Integer Public time As Integer Public dwExtraInfo As IntPtr End Structure ''Mouse Scroll Function Public Function MouseScroll(ByVal scrollDirection As SCROLLDIRECTION) As Boolean Dim MOUSESCROLLINPUT As New MOUSEINPUT ''Create the scroll data MOUSESCROLLINPUT.dwExtraInfo = 0 MOUSESCROLLINPUT.dwFlags = MOUSEEVENTF_WHEEL ''Scroll event MOUSESCROLLINPUT.dwType = INPUT_MOUSE ''Mouse Input MOUSESCROLLINPUT.dx = 0 ''X coord - 0=Current MOUSESCROLLINPUT.dy = 0 ''Y coord - 0=Current MOUSESCROLLINPUT.mouseData = scrollDirection ''Contains direction and amount to scroll MOUSESCROLLINPUT.time = 0 Dim cbSize As Integer = Marshal.SizeOf(GetType(MOUSEINPUT)) Return SendInput(1, MOUSESCROLLINPUT, cbSize) End Functionוהקוד לביצוע הגלילה למעלה ולמטה הוא:MouseScroll(SCROLLDIRECTION.scrollDown)'For Scrolling DownMouseScroll(SCROLLDIRECTION.scrollUp)'For Scrolling Upהינה כמה מקורות שניסתי להיעזר בהם בשביל לפתור את הבעיה:http://objectmix.com/csharp/119280-sendinput-just-doesnt-work.htmlhttp://www.pinvoke.net/default.aspx/user32.SendInputגם שמה רשום כמה דברים בקשר למערכות 64, אבל אני לא יודע איך לשלב את זה.אשמח אם תעזור לי... תודה!
פורסם 2008 בנובמבר 1117 שנים בלינק השני רשום בדיוק מה לעשות: אתה צריך להגדיר את MOUSEINPUT ככה: <StructLayout(LayoutKind.Explicit)> _ Private Structure MOUSEINPUT <FieldOffset(0)> Public dx As Integer <FieldOffset(4)> Public dy As Integer <FieldOffset(8)> Public mouseData As Integer <FieldOffset(12)> Public dwFlags As Integer <FieldOffset(16)> Public time As Integer <FieldOffset(20)> Public dwExtraInfo As IntPtr End Structureואם אתה ב-64bit, אתה צריך להכפיל את כל ה-offsetים ב-2 (יענו 0,8,16 וכו').אופציה שנייה היא מראש לקמפל את התכנית ל-32 ביט במקום 64 ביט (ציטוט מהלינק הראשון):I have found out the reason. My Windows is 64bit version and the .NETapp becomes 64bit application. I changed the build option to x86, andit worked.
פורסם 2008 בנובמבר 1117 שנים מחבר תודה רבה על התגובה!אוקיי ניסתי את מה שאמרת, אבל עדיין לא עובד... <StructLayout(LayoutKind.Explicit)> _ Private Structure MOUSEINPUT Public dwType As Integer <FieldOffset(0)> Public dx As Integer <FieldOffset(8)> Public dy As Integer <FieldOffset(16)> Public mouseData As Integer <FieldOffset(24)> Public dwFlags As Integer <FieldOffset(32)> Public time As Integer <FieldOffset(40)> Public dwExtraInfo As IntPtr End Structureאני רוצה להשאיר את האפשרות כמו שאמרת לקמפל אותו ל32 במקום 64כאפשרות אחרונה, ואני רוצה שהקוד אולי יהיה תואם לשני סוגי המערכות...אשמח לעזרה בקשר לזה
פורסם 2008 בנובמבר 1117 שנים קודם כל, קוד של 32 ביט אמור לרוץ על מערכות של 64 ביט.חוץ מזה, כנראה אפשר ליצור קוד שבודק על איזו מערכת הוא רץ ולפעול בהתאם.
פורסם 2008 בנובמבר 1117 שנים מחבר לא הסברתי את עצמי מספיק טוב, אני יודע שהוא יהיה תואם לשני המערכות אם אני יקמפל אותו ל-32 ביט,אבל אני רוצה להשאיר את זה כאפשרות אחרונה.התכוונתי שאולי יש צריך לשנות משהו בקוד שיאפשר לו לרוץ בשני המערכות הפעלה,קראתי על משהו כמו ההבדלים בין intrptr בין 32 ביט ל-64 ואולי זה מתקשר לזה אבל אני לא מביןמה בדיוק אפשר לעשות...אשמח לעזרה נוספת... תודה!
פורסם 2008 בנובמבר 1217 שנים נסה לבדוק את הדוגמא של VB מפה:http://www.pinvoke.net/default.aspx/user32.SendInput
פורסם 2008 בנובמבר 1217 שנים הוא כבר נתן את הלינק הזה בפוסט הראשון.בכל מקרה, נסה מה שכתוב בסוף של הלינק הראשון:Since you're only using the MOUSEINPUT part of the union, and ithappens to be the biggest one of the three, you can remove the othertwo and change the declaration of INPUT tostruct INPUT{public int type;public MOUSEINPUT mi;}אם זה לא עובד, אז כנראה אתה צריך לפעול ככה:http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1154270&SiteID=1I think the answer is actually declaring two INPUT structures (INPUT/INPUT64) with the correct respective outputs, declaring an SENDINPUTOBJECT class that has a getINPUT and getINPUT64, two P/Invoke declarations for SendInput one that takes an INPUT, the other takes an INPUT64, and finally a method "SendInput()" that checks the size of IntPtr, gets the appropriate INPUT and calls SendInput with that object.(שזה פחות או יותר מה שאמרתי - לממש שתי פונקציות נפרדות, אחת עבור 32 ואחת עבור 64 ביט, ולקרוא לפונקציה המתאימה בהתאם למערכת ההפעלה)
פורסם 2008 בנובמבר 1317 שנים מחבר הוא כבר נתן את הלינק הזה בפוסט הראשון.בכל מקרה, נסה מה שכתוב בסוף של הלינק הראשון:אם זה לא עובד, אז כנראה אתה צריך לפעול ככה:http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1154270&SiteID=1(שזה פחות או יותר מה שאמרתי - לממש שתי פונקציות נפרדות, אחת עבור 32 ואחת עבור 64 ביט, ולקרוא לפונקציה המתאימה בהתאם למערכת ההפעלה)קראתי בדיוק את מה שרשמת:struct INPUT{public int type;public MOUSEINPUT mi;}אבל לא מצאתי דרך לקשר את זה איכשהו לקוד כי אני לא רואה בדיוק מקום בקוד לשנות/לשים את זה.בדרך לאפשרות השנייה הרעיון נשמע דיי טוב, אבל הבעיה הראשונה היא שקודם כול עליי לנסות לסדראת ה-API שיעבוד ב-64 ביט לפני שאני יוכל לגרום לו לעבוד בשני המערכות הפעלה...קראתי שמה על משהו כמו sizeof(int) שנשמע מעניין, אבל האפשרות הזו לא קיימת ב-VB .net.אשמח אם תוכל לנסות לעזור לי עוד, כי אני חושב שאנחנו מתקדמים.
פורסם 2008 בנובמבר 1317 שנים הפונקציה SendInput צריכה לקבל מערך של INPUT, ולא MOUSEINPUT.תסתכל איך השתמשו בה באותו ת'רד.(הקוד אמנם ב-#C, אבל זה כמעט אותו דבר כמו VB.NET).
פורסם 2008 בנובמבר 1317 שנים מחבר אני חושב שהבנתי, אבל לא הבנתי בדיוק מה השורות אומרות:struct INPUT{public int type;public MOUSEINPUT mi;}public int type , מה ז"א type?public MOUSEINPUT mi מה ז"א mi? מה הוא אומר בקוד הזה?
פורסם 2008 בנובמבר 1317 שנים נו, זה קוד של #C, אתה צריך לבדוק איך להמיר אותו ל-VB.NET.type ו-mi הם בסך הכל השמות של השדות.תסתכל על הקוד שבת'רד ההוא ותראה איך משתמשים בהם.
פורסם 2008 בנובמבר 1317 שנים מחבר בסוף החלטתי לעשות בדרך יותר פשוטה שימוש ב-Mouse_eventוב-Sendinput שברגע שהוא מזהה מערכת של 64 ביט הוא משתמש ב-Mouse_Eventוכשהוא מזהה 32 ביט הוא מריץ את sendinput.אולי לא עובד על XP64Bit אבל עובד על וויסטה 64 ביט (שלדעתי זה מספיק לביינתים).תודה רבה על העזרה!!!!!והקוד לזיהוי המערכת הפעלה הוא פשוט (למי שרוצה):If intptr.size=4 then'32Bitelse'64BitEnd If
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.