2012-01-22 32 views
5

thể trùng lặp:
SendInput and 64bitsSendInput không thành công trên 64bit

Tôi đang sử dụng SendInput từ mã NET (PInvoke).
mã được sử dụng để hoạt động tốt trên hệ điều hành 32 bit, nhưng bây giờ trên WIN7 SendInput trả về 0 và lỗi cuối cùng được đặt thành 57 (ERROR_INVALID_PARAMETER).
Tôi không thể biên dịch mã của mình dưới dạng x86 khi tôi được tải vào máy chủ lưu trữ 64 bit. Ngoài ra, tôi đã thử các giải pháp khác nhau liên quan đến kích thước cấu trúc và bù trừ trường, không có hiệu quả nào.
Đây là hàng nhập khẩu của tôi PInvoke và các loại:

[StructLayout(LayoutKind.Sequential)] 
struct KEYBOARD_INPUT 
{ 
    public uint type; 
    public ushort vk; 
    public ushort scanCode; 
    public uint flags; 
    public uint time; 
    public uint extrainfo; 
    public uint padding1; 
    public uint padding2; 
} 

[DllImport("User32.dll", SetLastError=true)] 
private static extern uint SendInput(
    uint numberOfInputs, 
    [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] KEYBOARD_INPUT[] input, 
    int structSize); 

và mã sử dụng là:

uint result = SendInput(
     (uint)inputs.Count, 
     inputs.ToArray(), 
     Marshal.SizeOf(inputs[0])); 

nơi đầu vào mảng chứa 1 KEYBOARD_INPUT struct.
sản lượng này trong kết quả = 0 và khi tôi kiểm tra lỗi cuối cùng tôi nhận được lỗi cuối cùng được đặt thành 57 (ERROR_INVALID_PARAMETER, Thông số không chính xác).

Có cách nào để thực hiện công việc này dưới máy chủ 64 bit trong WIN7 64bit OS không? công trình này trong XP ...

nhờ

Trả lời

13

Hãy thử sử dụng các định nghĩa sau đây (lịch sự của pinvoke.net):

const int INPUT_MOUSE = 0; 
const int INPUT_KEYBOARD = 1; 
const int INPUT_HARDWARE = 2; 
const uint KEYEVENTF_EXTENDEDKEY = 0x0001; 
const uint KEYEVENTF_KEYUP = 0x0002; 
const uint KEYEVENTF_UNICODE = 0x0004; 
const uint KEYEVENTF_SCANCODE = 0x0008; 

struct INPUT 
{ 
    public int type; 
    public InputUnion u; 
} 

[StructLayout(LayoutKind.Explicit)] 
struct InputUnion 
{ 
    [FieldOffset(0)] 
    public MOUSEINPUT mi; 
    [FieldOffset(0)] 
    public KEYBDINPUT ki; 
    [FieldOffset(0)] 
    public HARDWAREINPUT hi; 
} 

[StructLayout(LayoutKind.Sequential)] 
struct MOUSEINPUT 
{ 
    public int dx; 
    public int dy; 
    public uint mouseData; 
    public uint dwFlags; 
    public uint time; 
    public IntPtr dwExtraInfo; 
} 

[StructLayout(LayoutKind.Sequential)] 
struct KEYBDINPUT 
{ 
    /*Virtual Key code. Must be from 1-254. If the dwFlags member specifies KEYEVENTF_UNICODE, wVk must be 0.*/ 
    public ushort wVk; 
    /*A hardware scan code for the key. If dwFlags specifies KEYEVENTF_UNICODE, wScan specifies a Unicode character which is to be sent to the foreground application.*/ 
    public ushort wScan; 
    /*Specifies various aspects of a keystroke. See the KEYEVENTF_ constants for more information.*/ 
    public uint dwFlags; 
    /*The time stamp for the event, in milliseconds. If this parameter is zero, the system will provide its own time stamp.*/ 
    public uint time; 
    /*An additional value associated with the keystroke. Use the GetMessageExtraInfo function to obtain this information.*/ 
    public IntPtr dwExtraInfo; 
} 

[StructLayout(LayoutKind.Sequential)] 
struct HARDWAREINPUT 
{ 
    public uint uMsg; 
    public ushort wParamL; 
    public ushort wParamH; 
} 

[DllImport("user32.dll")] 
static extern IntPtr GetMessageExtraInfo(); 

[DllImport("user32.dll", SetLastError = true)] 
static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize); 

Sau đó, trong mã khách hàng của bạn, sử dụng:

INPUT[] inputs = new INPUT[] 
{ 
    new INPUT 
    { 
     type = INPUT_KEYBOARD, 
     u = new InputUnion 
     { 
      ki = new KEYBDINPUT 
      { 
       wVk = key, 
       wScan = 0, 
       dwFlags = 0, 
       dwExtraInfo = GetMessageExtraInfo(), 
      } 
     } 
    } 
}; 

SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT))); 
+1

lớn đã giải quyết được vấn đề – Oren

Các vấn đề liên quan