使用鉤子技術實現QT中的全域性熱鍵

2021-06-08 17:54:35 字數 1547 閱讀 5421

qt中的窗體只有獲得焦點的情況下,才會響應按鍵或滑鼠事件(mfc的窗體是否也是如此?)。但是在實際開發過程中,我們常常需要的是即使某些窗體處於失去焦點狀態時,也能響應相應的鍵盤或者滑鼠事件。那麼,應該如何實現呢?

筆者在遇到這種情況時,首先考慮的還是使用事件監控的方式,但筆者在實際使用中發現,該種方式不是太適合。(主窗體需要監控所有的子窗體並且在監控qaxwidget時情況也很特殊,筆者並未深入研究。)。其次考慮的是將所有的子窗體派生,在派生中傳遞所有的按鍵或者滑鼠事件至父窗體。很明顯,該種方式也不合適。想想為什麼?後來,網上有人說用全域性熱鍵能夠實現,筆者對全域性熱鍵沒有研究。用了鉤子技術來實現的。(windows作業系統)

**如下.

.h檔案

typedef void (mainwidget::*func)(int);

struct item_func

;class mainwidget : public qwidget

; void select_next_card(int){};

public:

//註冊鉤子

void register_key_hook();

//釋放鉤子

void unregister_key_hook();

void excute_function(func fun,int param)

}

.cpp檔案

備註一下:1.全域性鉤子(dll匯出函式方式) 從系統級別對訊息進行攔截2.區域性鉤子(上述**採取的方式)是從應用程式級別對訊息進行攔截

舉例:使用區域性鉤子 攔截win按鍵訊息 發現無論如何做 開始選單都能彈出來 若換成全域性的鉤子 則開始選單不再彈出 呵呵

VC實現的全域性鍵盤鉤子

鍵盤鉤子的功能就是監視系統按鍵動作,這是一種很有用的技術,在一些工程專案中,有監視人員操作動作的需求,便於定位故障原因。也可以用於實現密碼監視等黑客行為。鉤子分執行緒專用鉤子和全域性鉤子,執行緒專用鉤子只能勾到本執行緒的訊息,而全域性鍵盤鉤子能勾到所有系統訊息,功能非常強大,所以用得不好也很容易引起...

Qt中全域性變數的使用

一般在專案中想要定義乙個變數可以被多個類進行訪問,此時就可以定義全域性變數。習慣上會將專案中所有類都用到的變數,集中定義在乙個標頭檔案中,使用時只需包含此標頭檔案。但是對於我這樣基礎不牢靠的人,就犯了乙個錯誤,而且當時怎麼也沒找到原因。最後在別人的幫助下,得以解決。現記錄一下。ifndef data...

QT中的除錯技術

下面提供一些有用的提示來幫助你除錯基於qt開發的應用程式。安裝配置qt時,要確保包含除錯選項。在一些平台上,在除錯模式下編譯qt將導致應用程式比預想的要大。在編譯qt的時候,預設要編譯框架。在結果中,可以找到發行版和除錯版 如qtcore和qtcore debug 如果通過 no framework...