2013-04-24 112 views
0

我正在考慮用C++針對Windows 7(使用Windows api)創建一個允許在同一臺PC上使用第二個鼠標指針的軟件,所以我的問題是Windows的女巫部分是處理鼠標的渲染指針? 我相信,理解它的實際工作方式將允許我模仿它以呈現第二個鼠標指針。 謝謝。鼠標指針渲染器

回答

4

Windows的窗口系統只支持一個「true」光標:它是2D圖形芯片組的低級功能(這就是爲什麼光標不顯示在屏幕截圖中)。 Windows將保留光標位圖的獨立視頻內存區域設置爲獨立區域:具有AND/XOR通道(用於索引的不透明度和顏色反轉)的DDB(設備相關位圖),或用於透明度爲alpha的32bpp RGBA表面遊標(這是如何實現「顯示光標陰影」功能)。我的理解是,光標被應用於實際的輸出圖像,因爲它由輸出設備「掃描」(例如DAC用於VGA輸出或任何DVI和HDMI使用),所以它在幀緩衝區中從不存在 - 這就是光標在我們合成窗口管理器之前的幾天就工作過了,並且無需讓應用程序在光標所在的位置重繪自己。

對於光標使用這個特殊的技巧也是必要的,以保持延遲最小。如果你編寫一個繪製到窗口表面的程序(例如使用GDI甚至通過OpenGL或Direct3D),你會發現它比真實光標滯後幾毫秒,這對用戶來說很容易知道(這就是爲什麼現代RTS遊戲使用這個硬件遊標功能而不是自己重新實現)。

我沒有辦法擴展這個功能,我知道 - 你將不得不成爲反彙編之神來修改Windows和圖形驅動程序來實現繪製多個遊標的能力。

這就是事物的表現方面。對多個遊標的實際應用程序級支持也很棘手 - 請記住,光標移動對應於各種與鼠標相關的窗口消息發送給hWnds。兩個遊標的問題是這些消息會衝突,儘管理論上它應該工作,只要它們被正確地序列化到一個隊列中即可。應用程序會出現問題,很多人會假設,例如,只有一個控件可以一次處於Hover狀態,如果您有多個遊標,那麼應用程序只會尊重最新的遊標消息。

我可能會建議您看看Windows 7中引入的多點觸控支持,它支持多個同時「遊標」,雖然它只針對手指而不是鼠標。

+0

謝謝您的評論和建議。我不認爲這很複雜。 – sifadil 2013-04-24 00:56:20

+0

順便說一下,屏幕錄製軟件實際上能夠記錄鼠標光標,所以他們只是在視頻上放置假的光標形狀? – sifadil 2013-04-24 01:08:52

+1

@Dai:應用程序可以通過使用[原始輸入](http://msdn.microsoft.com/en-us/library/windows/desktop/ms645536.aspx)API來支持多個鼠標而不用擔心碰撞。這是因爲你必須註冊你感興趣的特定設備,然後通知消息告訴你哪個設備正在發送通知。 MSDN甚至提到了這種可能性:「即使應用程序來自同一類型的設備,應用程序也可以區分輸入源**例如,兩個鼠標設備**」 – 2013-04-24 01:14:58