如何在應用程式忙碌時探測使用者的按健

2021-06-01 01:33:06 字數 998 閱讀 6531

這個問題在論壇中的出現頻率很高。在解決這個問題時,首先要明確windows處理使用者輸入的方法完全不同於dos作業系統。當使用者按鍵後,dos應用向作業系統提出請求,而在windows中,當使用者事件發生時,是由windows請求呼叫相應的**,**實現自己必須的處理,最後將控制返回到作業系統。

當你從dos作業系統程式設計轉向windows的時候,你會很不習慣windows的面向事件與訊息的處理模式,但是物件導向的處理方法在windows中非常靈活實用。

本文要討論的問題是如何在應用程式中實現使用者事件的輪詢。例如,當你的應用程式在忙碌狀態時,如何探測使用者按鍵(escape)來終止正在進行的處理或操作。

當使用者按鍵或移動滑鼠導致系統事件發生時,作業系統將這些事件儲存在相應的應用程式訊息佇列中,事件會一直以訊息的形式儲存在訊息佇列中直到應用程式完訊息並將控制返回到windows,這時windows將把訊息佇列中的下一條訊息傳送到應用程式。

所以,為了確定是否使用者已經按下了某乙個按鍵,應用程式需要確定某一按鍵的訊息當前是否在訊息佇列中。為此可以呼叫peekmessage函式,例如:

msg msg;

// 檢查是否按下 escape 鍵

if (::peekmessage(&msg, m_hwnd, wm_keyfirst,

wm_keylast, pm_remove))

第乙個引數msg結構接收與訊息有關的資訊。第二個引數是window控制代碼,如果程式是基於mfc的應用,這個引數傳遞m_hwnd即可。下兩個引數是確定型別的訊息,peekmessage將返回訊息佇列中落在這兩個值之間的第乙個訊息。因為這裡我們感興趣的是按鍵,所以就用wm_keyfirst 和 wm_keylast作為引數。最後乙個引數可以是pm_noremove 或者 pm_remove,表示訊息資訊是否應該從訊息佇列中刪除。

如果peekmessage在請求範圍內尋找訊息,他返回非零值。這樣上面的**檢查是否發現wm_keydown訊息並且wparam等於vk_escape,如果發現則退出迴圈並終止**的處理。

如何在Windows下發布QT應用程式?

當編譯完成qt程式生成可執行檔案後,發布到其他客戶端的方法有兩種 一種是使用靜態庫編譯 另一種是使用動態庫編譯,同時附上需要的動態庫。優點 發布簡單,只需要單一qt應用程式。缺點 庫檔案很大,更新程式版本不方便,每次公升級都需要重新發布所有的程式。mingw平台靜態編譯qt庫時,產生靜態編譯專案檔案...

如何在Windows下發布QT應用程式

環境介紹 作業系統 windows 10 64bit ide套件 qt creator 3.6.1 編譯器版本 qt5.6.0 msvc2015 32bit 如何發布 從qt安裝目錄的 bin 下我們可以找到乙個名叫windeployqt.exe的可執行檔案,這是乙個官方提供的 應用部署工具,可以很...

如何在iphone應用程式中傳送簡訊

我們知道可以使用這樣的 在iphone中傳送簡訊 但這樣的方式無法指定簡訊內容。那麼我們可以使用messageui框架。首先在程式中匯入messageui.framework。import標頭檔案 import devicedetection.h 然後在 中使用下面的語句來呼叫簡訊傳送視窗,並指定號...