2017-03-31 69 views
0

我正試圖用鼠標中鍵實現系統範圍的拖動操作。它應該重寫其他程序中的中間鼠標拖動行爲。目前,我正在使用全系統鉤子處理全局鼠標事件。如何正確覆蓋其他應用程序(Windows)中的鼠標事件?

問題是 - 許多程序仍然接收和處理相同的事件,就像我沒有攔截它們一樣。

這裏是我的嘗試:

  • 沒有要求鼠標按下事件的一個鉤子:我從來沒有收到鼠標了,所以我不知道在哪裏,什麼時候停止拖動

  • 不調用鼠標移動的下一個鉤子:光標極度減速

  • 不會調用鼠標的下一個掛鉤:系統中的大多數窗口在我的拖動完成後會停止對鼠標事件作出反應

  • 總是調用鏈中的下一個鉤子:如果鼠標中的控件已經滾動,大部分時間它會在我的拖動進行時滾動。此外,UWP應用程序在我的拖動過程中繼續接收鼠標事件,因此如果MS Edge中的鏈接恰好在光標啓動時處於光標下方,並且鼠標沒有離開邊緣邊界,Edge會收到點擊事件並打開新標籤頁

我需要的是:當用戶拿着中鼠標並開始拖動時,我的拖動處理程序應該被調用,並且沒有其他處理程序,如文件拖動,滾動等應該發生。

+0

當你開始拖動你需要調用* SetCapture()*和* ReleaseCapture()* whe拖動結束。但沒有設置任何鉤子 – RbMm

+0

@RbMm其實,我試過。問題是我需要從任何應用程序開始,而不僅僅是從我自己的應用程序開始。我希望能夠通過窗口中的任意點拖動系統中的任何窗口,覆蓋任何其他行爲。例如,問題是,即使我在鼠標關閉後收到第一個MouseMove後調用SetCapture,Microsoft Edge仍然通過滾動繼續處理鼠標移動。 – LOST

回答

0

我結束了幾分哈克解決方案:

  • 不叫鼠標的下鉤下來中間的按鈕
  • 它被按下記錄
  • 處理鼠標了的時候,如果用戶沒有拖動 - 重放整個鼠標+使用SendInput從一個單獨的線程(避免由於重入的死鎖)
相關問題