2013-06-26 34 views
7

Tôi đang sử dụng SendInput() để gửi các vị trí tương đối của con chuột. Đầu tiên bị bệnh điện thoại cho bạn những gì đang làm.Màn hình chuyển sang màu đen khi tôi sử dụng SendInput để gửi các vị trí con trỏ chuột

tôi sử dụng ngón tay để di chuyển chuột. Vì vậy, đầu tiên tôi theo dõi ngón tay của tôi trong một hình ảnh 640x480 và có được vị trí tuyệt đối bằng pixel với hình ảnh.

sau đó tôi gửi vị trí đó đến phương pháp sau để tạo các lệnh vị trí chuột tương đối bằng cách sử dụng đầu vào gửi.

Khi ngón tay đi đến ranh giới bên trái (xlim1) hoặc con trỏ bên phải (xlim2) tiếp tục cuộn theo chiều ngang sang trái hoặc phải tùy thuộc vào giới hạn nào. Vấn đề là khi tôi chạy mã và chỉ khi con trỏ bắt đầu di chuyển, màn hình chuyển sang màu đen.

khi tôi nhận xét phần khác nếu (cx> = prevX & & cx> xlim2) {....} phần, sau đó nó hoạt động .. (Vì vậy, khi ngón tay trỏ đến giới hạn bên phải của hình ảnh con trỏ tiếp tục cuộn theo chiều ngang sang bên phải phần nhận xét cho phép cuộn ngang bên trái).

Biến đầu tiên bool sẽ là true nếu đây là lần đầu tiên, chúng tôi nắm bắt được ngón tay. Nếu không thì nó là sai.

void movMouse(int cx, int cy, bool first){ 
static int prevX = 0; 
static int prevY = 0; 

static int leftPrevX; 
static int rightPrevX; 

int mx,my; 

if(first == true){ 
    prevX = cx; 
    prevY = cy; 
} 
else{ 
    mx = (cx - prevX); 
    my = (cy - prevY); 

    if(cx <= prevX && cx < xlim1){ 
     mx = -20; 

     INPUT input; 
     input.type   = INPUT_MOUSE; 
     input.mi.mouseData = 0; 
     input.mi.dx   = -(mx); 
     input.mi.dy   = (my); 

     input.mi.dwFlags = MOUSEEVENTF_MOVE; 

     SendInput(1, &input, sizeof(input)); 
    } 
    else if(cx >= prevX && cx > xlim2){ 
     mx = 20; 

     INPUT input; 
     input.type   = INPUT_MOUSE; 
     input.mi.mouseData = 0; 
     input.mi.dx   = -(mx); 
     input.mi.dy   = (my); 

     input.mi.dwFlags = MOUSEEVENTF_MOVE; 

     SendInput(1, &input, sizeof(input)); 
    } 
    else { 
     INPUT input; 
     input.type   = INPUT_MOUSE; 
     input.mi.mouseData = 0; 
     input.mi.dx   = -(mx); 
     input.mi.dy   = (my); 

     input.mi.dwFlags = MOUSEEVENTF_MOVE; 

     SendInput(1, &input, sizeof(input)); 
    } 

    prevX = cx; 
    prevY = cy; 
} 

}

+0

Không có kết nối rõ ràng giữa việc tạo đầu vào chuột và "màn hình chuyển sang màu đen". Có một lỗ hổng trong mã của bạn, bạn không khởi tạo cấu trúc INPUT hoàn toàn, tạo ra dữ liệu không có thật cho MOUSEINPUT.time và .dwExtraInfo. Sử dụng 'INPUT input = {};" Đảm bảo có sự chậm trễ hợp lý sau khi bạn gọi mã này –

+0

Nó hoạt động !!!!!!!!!! ..... Wow u đã cứu mạng tôi ... Tôi không thể cảm ơn bạn đủ !!!!!! ......... – user2389323

Trả lời

6

Hãy thử

ZeroMemory(&input,sizeof(input)); 

cũng intialize tất cả các biến bao gồm input.time nó làm việc cho tôi :)

1

Tôi chạy vào vấn đề này cùng, mặc dù tôi đã gọi ZeroMemory và làm mọi thứ khác một cách chính xác. Tôi đã sử dụng input.mi.time để thông báo cho Windows về khoảng cách giữa các lần nhấp, ví dụ: do đó, nhấp đúp sẽ hoạt động chính xác. Tuy nhiên tôi đã nhận được các giá trị 'thời gian' từ một máy tính từ xa. Bởi vì chúng khác với thời gian của máy tính cục bộ, nó đã khiến Windows gọi trình bảo vệ màn hình! Để khắc phục sự cố, tôi đã thêm một số logic để phát hiện độ lệch giữa các máy tính và mang lại các giá trị phần nào phù hợp với nhau.

Tóm tắt: Đảm bảo input.mi.time là số không hoặc giá trị hơi gần với GetTickCount(). Sử dụng ZeroMemory để khởi tạo biến là một gợi ý tuyệt vời.

+0

Cảm ơn rất nhiều vì đã tạo kết nối với trình bảo vệ màn hình! –

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