2014-06-16 50 views
0

我正在研究平滑鼠標光標移動的應用程序,以便可以使用普通鼠標繪製應用程序(如MS Pain,SAI等)。但是,我不希望我的應用程序實際移動鼠標光標,因爲它的位置用於平滑處理。這意味着我必須讓繪圖應用程序忽略鼠標光標的實際位置,併爲其提供假的,平滑移動的鼠標光標的位置。在沒有移動光標的情況下,鼠標在特定位置(在特定窗口內)單擊/拖動(.NET/C++)

你對此有何想法?我的想法是獲取目標窗口的處理程序,禁用它(因爲它禁用輸入,所以當我移動鼠標時,Windows不會將它通知給窗口),發送WM_LBUTTONDOWN,一系列WM_MOUSEMOVEs,以及WM_LBUTTONUP消息,然後再次啓用該窗口以獲得期望的結果。

我很快把一些代碼放在一起,但它沒有正常工作。然後我注意到一些奇怪的事我拿走了禁止窗口的代碼,以及WM_MOUSEMOVE消息。剩下的代碼應該在目標窗口中進行簡單的點擊。但是,在大多數情況下,它沒有。當我嘗試點擊MSPaint的畫布時,沒有任何事情發生,但SendMessage返回0.但是當我嘗試點擊VS2013或Google Chrome窗口時,它完美運行。 (?所以,現在什麼)

簡化代碼爲以下幾點:

[DllImport("user32.dll", EntryPoint = "FindWindowA", SetLastError = true)] 
static extern IntPtr FindWindow(IntPtr lpClassName, string lpWindowName); 
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
static extern int SendMessage(IntPtr hWnd, int msg, int WParam, int LParam); 

void ClickInsideAnotherWindow(string windowTitle, Point clickPos) 
{ 
    IntPtr hWnd = FindWindow(IntPtr.Zero, windowTitle); 

    //MSDN said: 
    //The low-order word specifies the x-coordinate of the cursor. 
    //The high-order word specifies the y-coordinate of the cursor. 
    // 
    //The following line of code does the trick by shifting 
    //the Y coordinate by 16 and ORing it with the X coordinate. 

    int lParam = ((clickPos.Y << 16) | clickPos.X); 

    SendMessage(hWnd, 0x0201, 0, lParam); 
    System.Threading.Thread.Sleep(10); //Wait 10ms, just to be sure... 
    SendMessage(hWnd, 0x0202, 0, lParam); 

    //0x201 is equivalent to WM_LBUTTONDOWN, while 
    //0x202 is equivalent to WM_LBUTTONUP 
} 


所以我想手動發送鼠標事件的一個窗口,而忽略了真正的光標位置。我編寫的主要是C#,但如果它更容易得到這個工作在C++中,我會使用它(並可能使一個DLL,如果是這種情況)。如果我很難跟進,我很抱歉,我儘可能地盡力解釋這一點。

請幫我解決這個問題!

+0

你正在問一個時間機器。一個可以預測用戶將要移動他的鼠標的方式。這沒有意義。獲得原始曲線後,您只能平滑曲線。 –

+0

@HansPassant不,不是。你可能不瞭解我的問題。有一點對我的光標慢慢爬行自己:)(我已經有這部分工作,它是簡單的線性插值)我不想預測任何東西,我只是想使用該點作爲虛擬光標,而不是'真正的'一個。 – Techie

回答

0

使用Send/PostMessage時,某個窗口必須位於前景,某個窗口必須具有焦點。

在某些使用DirectX的應用程序或其他具有特殊屏幕繪圖方法的應用程序中,窗口必須位於鼠標指針下方。就在下面,而不是前景。

我不知道這正是爲什麼。

您可能會嘗試使用AttachThreadInput和SetForegroundWindow/SwitchToThisWindow和SetFocus,這三種組合中的一些應該可以工作。

相關問題