2010-01-05 156 views
2

我希望創建一個全球性的鼠標鉤子,在工作XP/Vista/7的,這將允許我以訪問X,Y值的鼠標輸入,和之前修改這些值他們打的Windows ...全球鼠標鉤子+模擬鼠標輸入

我也希望能夠在實際的鼠標輸入之間的模擬鼠標輸入...

例如,讓我們說,我們的投入是這樣的:

1:1 ,0 2:2,0 3:3,0 4:?,?

我希望能夠截取輸入數字4並通過'if'語句運行它:如果輸入的值匹配某些參數,我想通過添加或減去它來修改該值...

USB鼠標具有在125Hz的默認輪詢率和最大1000Hz的的...

如果可能的話(尤其是當輪詢率設定爲小於1000Hz的),我想「注入」'之間的投入實際的鼠標更新(關鍵)​​例如:

(以毫秒爲單位)

0008 - 1,0 0016 - 1,0 0032 - 2,0

所以鼠標在更新125Hz的...我可以檢測輸入的頻率,併發送輸入所有其他輸入? ??因此,例如,我可以「雙」鼠標頻率在125Hz從到250Hz之間,並模擬我自己的「之間」根據我設置任何規則更新...

任何這些似乎併合理?現在我正在使用C#,我正在使用本教程中的「Gma.UserActivityMonitor」:http://www.codeproject.com/KB/cs/globalhook.aspx,但出於某種原因,我得到的性能影響使得在全屏遊戲中使用此代碼在鼠標輸入上產生不可用的延遲去鉤...

也許我需要用C++寫東西?任何幫助將不勝感激。謝謝!

+0

這聽起來不妥。你爲什麼需要這樣做? – Skilldrick 2010-01-05 13:47:44

+0

我想製作一個覆蓋Windows 3D菜單系統的鼠標接口,並且我需要能夠在保持鼠標輸入的同時旋轉,縮放,平移等,因此我需要能夠將鼠標輸入鉤住低級別並修改/調整它。 – Drax 2010-01-20 06:45:59

回答

1

希望this link on grabbing raw mouse input將是有益的,它包括C#和C++的版本編寫的庫。它意味着可以在Windows中使用多個鼠標,但希望您可以模擬它用於完成的任務。

1

我已經建立一個庫,可以幫你,這是一個簡單的C函數庫和can work on games where common windows api would not

下面的示例顯示瞭如何反轉鼠標移動與此庫,它基本上只是在-1垂直軸相乘位移,使他們發生在相反的方向:

#include <interception.h> 
#include "utils.h" // for process priority control 

enum ScanCode 
{ 
    SCANCODE_ESC = 0x01 
}; 

int main() 
{ 
    InterceptionContext context; 
    InterceptionDevice device; 
    InterceptionStroke stroke; 

    raise_process_priority(); 

    context = interception_create_context(); 

    interception_set_filter(context, interception_is_keyboard, INTERCEPTION_FILTER_KEY_DOWN | INTERCEPTION_FILTER_KEY_UP); 
    interception_set_filter(context, interception_is_mouse, INTERCEPTION_FILTER_MOUSE_MOVE); 

    while(interception_receive(context, device = interception_wait(context), &stroke, 1) > 0) 
    { 
     if(interception_is_mouse(device)) 
     { 
      InterceptionMouseStroke &mstroke = *(InterceptionMouseStroke *) &stroke; 

      if(!(mstroke.flags & INTERCEPTION_MOUSE_MOVE_ABSOLUTE)) mstroke.y *= -1; 

      interception_send(context, device, &stroke, 1); 
     } 

     if(interception_is_keyboard(device)) 
     { 
      InterceptionKeyStroke &kstroke = *(InterceptionKeyStroke *) &stroke; 

      interception_send(context, device, &stroke, 1); 

      if(kstroke.code == SCANCODE_ESC) break; 
     } 
    } 

    interception_destroy_context(context); 

    return 0; 
}  

您可能會看到有一個檢查在反轉垂直位移之前的INTERCEPTION_MOUSE_MOVE_ABSOLUTE標誌。通常操作系統使用相對座標,但我經歷過虛擬機內部的鼠標座標以絕對形式工作,而不是相對的。爲了簡單起見,該示例僅反轉相對位移。

您可以在http://oblita.com/Interception檢查更多的文檔。

+0

謝謝。我一定會考慮你的圖書館。 – 2012-02-24 01:15:00