我正在研究平滑鼠標光標移動的應用程序,以便可以使用普通鼠標繪製應用程序(如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,如果是這種情況)。如果我很難跟進,我很抱歉,我儘可能地盡力解釋這一點。
請幫我解決這個問題!
你正在問一個時間機器。一個可以預測用戶將要移動他的鼠標的方式。這沒有意義。獲得原始曲線後,您只能平滑曲線。 –
@HansPassant不,不是。你可能不瞭解我的問題。有一點對我的光標慢慢爬行自己:)(我已經有這部分工作,它是簡單的線性插值)我不想預測任何東西,我只是想使用該點作爲虛擬光標,而不是'真正的'一個。 – Techie