簡體   English   中英

函數 UnhookWindowsHookEx,如果在低級鈎子應用程序中被遺漏了怎么辦?

[英]Function UnhookWindowsHookEx, what if it is left out in a low-level hook application?

我最近一直在研究低級鍵盤掛鈎。 我已經開始工作了,但我對代碼有一些疑問。

我在這里看到控制台應用程序的完整代碼: http : //blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx

在 Main 函數中,我看到程序員調用了一個“UnhookWindowsHookEx”DLL 函數。 這個函數的目的是什么,如果它被注釋掉會發生什么? (特別是不好的后果?)

編輯:

還有一件事情。 為什么必須調用“Application.Run()”才能使代碼工作?

  1. 在這種特殊情況下,如果注釋了 UnhookWindowsHookEx,則不會發生任何不好的事情,因為程序無論如何都會退出。 但是在不再需要任何資源時關閉它是一個好主意,無論是在程序繼續執行時還是在程序結束時 - 以控制資源使用。

  2. 沒有 Application.Run 程序會立即退出。 使用 Application.Run 的第二個原因是 SetWindowsHookEx 要求 - 它需要消息循環才能工作。 Application.Run 執行消息循環。 按 Ctrl+C 可以停止程序。

調用 UnhookWindowsHookEx() 並不是絕對必要的,Windows 確實會發現您忘記這樣做並且會在您的程序終止時取消掛接。 必然如此,不清理鈎子會導致 Windows 掛起。 不把它留給操作系統被認為是“禮貌”。

Application.Run() 調用是實現低級掛鈎的程序的硬性要求。 如果沒有消息循環,例如使用 Console.ReadLine() 代替,則不會對鈎子進行回調。 特定的 Windows 承諾是回調將在調用 SetWindowsHookEx() 的同一線程上進行。 為此,Windows 以某種方式“闖入”並強制您的線程調用回調方法。 它不能隨意中斷您的線程並強制它進行調用,這會導致可怕的重入問題。 您的線程必須處於明確定義的狀態,它必須處於空閑狀態並且不會改變程序狀態。

消息循環,特別是 GetMessage() 或 PeekMessage() winapi 函數,是該信號,當您的線程泵送消息循環時,它處於空閑狀態並等待 Windows 告訴它做某事。 它是生產者/消費者問題的通用解決方案。

不,這很糟糕。

本機鈎子不是與文件或進程句柄相同意義上的“句柄”。 它們對於 Windows 會話是持久的,並且資源稀缺。

我盡可能地嘗試調用它,但我經常因為它掛起或其他原因而被迫終止我的,並且在兩打左右之后鈎子無法注冊。

所有其他使用鈎子的應用程序,如某些游戲,在此之后也會失敗。 唯一的解決方案似乎是重新啟動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM