בעיה ב-Sendinput API על מערכות 64 ביט. - VB .net - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

בעיה ב-Sendinput API על מערכות 64 ביט. - VB .net


shynet

Recommended Posts

שלום לכולם, השפה שאני משתמש בה זה 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 Down
MouseScroll(SCROLLDIRECTION.scrollUp)
'For Scrolling Up

הינה כמה מקורות שניסתי להיעזר בהם בשביל לפתור את הבעיה:

http://objectmix.com/csharp/119280-sendinput-just-doesnt-work.html

http://www.pinvoke.net/default.aspx/user32.SendInput

גם שמה רשום כמה דברים בקשר למערכות 64, אבל אני לא יודע איך לשלב את זה.

אשמח אם תעזור לי... תודה!

קישור לתוכן
שתף באתרים אחרים

בלינק השני רשום בדיוק מה לעשות: אתה צריך להגדיר את 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 is 64bit version and the .NET

app becomes 64bit application. I changed the build option to , and

it worked.

קישור לתוכן
שתף באתרים אחרים

תודה רבה על התגובה!

אוקיי ניסתי את מה שאמרת, אבל עדיין לא עובד...

  <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

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

אשמח לעזרה בקשר לזה

קישור לתוכן
שתף באתרים אחרים

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

אבל אני רוצה להשאיר את זה כאפשרות אחרונה.

התכוונתי שאולי יש צריך לשנות משהו בקוד שיאפשר לו לרוץ בשני המערכות הפעלה,

קראתי על משהו כמו ההבדלים בין intrptr בין 32 ביט ל-64 ואולי זה מתקשר לזה אבל אני לא מבין

מה בדיוק אפשר לעשות...

אשמח לעזרה נוספת... תודה!

קישור לתוכן
שתף באתרים אחרים

הוא כבר נתן את הלינק הזה בפוסט הראשון.

בכל מקרה, נסה מה שכתוב בסוף של הלינק הראשון:

Since you're only using the MOUSEINPUT part of the union, and it

happens to be the biggest one of the three, you can remove the other

two and change the declaration of INPUT to

struct INPUT

{

public int type;

public MOUSEINPUT mi;

}

אם זה לא עובד, אז כנראה אתה צריך לפעול ככה:

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1154270&SiteID=1

I 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 ביט, ולקרוא לפונקציה המתאימה בהתאם למערכת ההפעלה)

קישור לתוכן
שתף באתרים אחרים

הוא כבר נתן את הלינק הזה בפוסט הראשון.

בכל מקרה, נסה מה שכתוב בסוף של הלינק הראשון:

אם זה לא עובד, אז כנראה אתה צריך לפעול ככה:

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.

אשמח אם תוכל לנסות לעזור לי עוד, כי אני חושב שאנחנו מתקדמים.

קישור לתוכן
שתף באתרים אחרים

אני חושב שהבנתי, אבל לא הבנתי בדיוק מה השורות אומרות:

struct INPUT
{
public int type;
public MOUSEINPUT mi;
}

public int type , מה ז"א type?

public MOUSEINPUT mi

מה ז"א mi? מה הוא אומר בקוד הזה?

קישור לתוכן
שתף באתרים אחרים

בסוף החלטתי לעשות בדרך יותר פשוטה שימוש ב-Mouse_event

וב-Sendinput שברגע שהוא מזהה מערכת של 64 ביט הוא משתמש ב-Mouse_Event

וכשהוא מזהה 32 ביט הוא מריץ את sendinput.

אולי לא עובד על XP64Bit אבל עובד על וויסטה 64 ביט (שלדעתי זה מספיק לביינתים).

תודה רבה על העזרה!!!!!

והקוד לזיהוי המערכת הפעלה הוא פשוט (למי שרוצה):

If intptr.size=4 then
'32Bit
else
'64Bit
End If

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...