QT Win32下的訊息派送機制

2021-05-09 19:57:33 字數 3282 閱讀 5557

qt win32

下的訊息派送機制 ——

qeventdispatcherwin32類

昨天為了準備接下來的比賽,做了乙個雙鏈表的快速排序,弄到了很晚,又一次沒有進行我的原始碼分析。今天又忙到現在才有一會屬於自己的時間去做原始碼分析。

今天主要的入手點是

qt底層的訊息傳遞機制,主要分析

windows

下的實現機制,這樣就需要對

qeventdispatcherwin32

類進行分析了

:class q_core_export qeventdispatcherwin32 : public qabstracteventdispatcher

;該類的定義很簡單,其中有一些非常熟悉的函式:

bool processevents(qeventloop::processeventsflags flags);

該函式是之前在

exec()

中看到的那個呼叫的實現部分。

void registersocketnotifier(qsocketnotifier *notifier);

void registertimer(int timerid, int interval, qobject *object);

bool registereventnotifier(qwineventnotifier *notifier);

接下來的三個函式應該分別是對網路事件、定時器事以及其他事件的通知訊號註冊。

我想,最熟悉的莫過於:

friend lresult callback qt_internal_proc(hwnd hwnd, uint message, wparam wp, lparam lp);

這個函式代表了已經是

win32api

函式,這樣針對底層的應用了。可見,

qt也是從該函式得到一些通知訊息的。我們接下來看下該類這些函式的實現。先看下最熟悉的那個**函式:

lresult callback qt_internal_proc(hwnd hwnd, uint message, wparam wp, lparam lp)

else if (message == wm_user)

if (type >= 0) ;

qsndict *dict = sn_vec[type];

qsocknot *sn = dict ? dict->value(wp) : 0;

if (sn) }}

return 0;

} else if (message == wm_timer)

long result;

return result;

qeventdispatcherwin32 *eventdispatcher =

qobject_cast(qabstracteventdispatcher::instance());

q_assert(eventdispatcher != 0);

qeventdispatcherwin32private *d = eventdispatcher->d_func();

d->sendtimerevent(wp);

return 0;

}returndefwindowproc(hwnd, message, wp, lp);

}這裡主要通過該部分將訊息傳遞到

qt應用程式中:

long result;

return result;

值得關注的是

getwindowlongptr

函式和setwindowlongptr

,在以前的程式編寫過程中,沒有用過。查了下,原來是用來儲存一些指標的,通過

setwindowlongptr(wnd, gwlp_userdata, (long_ptr)eventdispatcher);

方法進行設定,再呼叫

getwindowlongptr(hwnd, gwlp_userdata);

進行讀取,最後需要轉換為自己需要的指標型別即可。

當得到的是定時器訊息時,通過

d->sendtimerevent(wp);

方法將訊息傳送,最終呼叫

timerevent

方法。

最終是非常熟悉的

defwindowproc(hwnd, message, wp, lp);

方法。

在看完這個**函式之後,順便看到了建立視窗的函式:

static hwnd qt_create_internal_window(const qeventdispatcherwin32 *eventdispatcher)

該函式沒有什麼特別的地方。

另外乙個定義的靜態方法是:

void winapi callback qt_fast_timer_proc(uint timerid, uint /*reserved*/, dword_ptr user, dword_ptr /*reserved*/, dword_ptr /*reserved*/)

可以看到,該方法是用來對定時器訊息進行傳送的。

我們再看下

createinternalhwnd()

方法,該方法呼叫了

qt_create_internal_window

方法,這樣,建立了最底層的

win32

應用程式。

接下來看到了事件迴圈需要呼叫的一些函式:

// ### qt 5: remove

q_core_export bool winpeekmessage(msg* msg, hwnd hwnd, uint wmsgfiltermin,

uint wmsgfiltermax, uint wremovemsg)

// ### qt 5: remove

q_core_export bool winpostmessage(hwnd hwnd, uint msg, wparam wparam, lparam lparam)

// ### qt 5: remove

q_core_export bool wingetmessage(msg* msg, hwnd hwnd, uint wmsgfiltermin,

uint wmsgfiltermax)

但是好像

qt要在

5.0版本以後採用新的機制進行。

這裡其他的函式沒有什麼太多的意義了,接下來就是看下事件是怎麼迴圈起來的,或許

qeventloop

中會有些我們想要的東西。不過今天的時間已經不允許了,只能明天再來分析。

2023年10

月29日星期四23:

53

VC Win32 訊息的分類

二 訊息的分類 1 系統訊息 訊息id的範圍 0 0x03ff 1024個 系統已經定義的訊息,所以程式都可以直接 使用,例如 wm create等。2 使用者自定義訊息 訊息id範圍0x0400 0x7fff 由使用者自己定義,滿足使用者自己的需要。使用者 自己負責傳送,自己負責響應 處理 定義了...

樹莓派下的驅動開發

程式設計師的入門經典當然就是hello world程式了,我的第乙個實驗就是要搭建實驗環境和工具鏈,通過交叉編譯的方式,在上位機完成hello world驅動程式的編寫,最終在板子上執行。最終搭建的平台如下,後期的通訊可以直接使用串列埠,就不需要hdmi輸出了 我們在上位機編寫hello world...

DELPHI下的WINDOWS訊息傳遞機制

blog開了很久,專業的東西一點沒寫,今天既然已經坐下了,就寫點東西吧,也算調整調整心緒!開發基於windows平台的應用程式時,了解windows訊息系統組成是非常必要的。訊息本身是作為乙個記錄傳遞給應用程式的,記錄中包含訊息的型別以及其它的資訊!這個記錄型別叫做tmsg,它在windows單元中...