導航:首頁 > 軟體知識 > 什麼程序轉發消息

什麼程序轉發消息

發布時間:2024-11-20 02:58:27

① 微信小程序可以向用戶推送消息嗎

微信小程序確實可以向用戶推送消息,這種功能現在主要通過訂閱消息實現。原有模板消息將在4月10日正式淘汰,今後,開發者僅能使用訂閱消息來通知用戶。接下來,我們將詳細介紹訂閱消息及其與模板消息的區別,以及如何接入和優化訂閱消息。

訂閱消息,即用戶主動訂閱後,開發者可發送的消息。它與模板消息的關鍵差異在於,訂閱消息的選擇權完全掌握在用戶手中,用戶需要主動點擊授權,開發者才能向其發送服務通知。此外,訂閱消息沒有時間限制,用戶未取消訂閱前,可以隨時接收服務通知,其安全系數也高於模板消息,因為用戶是主動接受消息,更符合微信的規則。

接入訂閱消息的流程大致分為三步:首先,開發者需在微信小程序後台選擇或添加服務類目,獲取消息模板;其次,將訂閱消息的觸發點融入用戶交互流程,確保用戶在需要時主動觸發訂閱;最後,用戶同意後,即可使用相應的模板進行推送。

為了做好訂閱消息,開發者需關注以下幾點:選擇合適的推送時機,避免打擾用戶;確保推送內容與用戶服務緊密相關,避免用戶誤解取消訂閱;將訂閱流程融入自然的產品體驗,提高用戶體驗;避免使用強制訂閱,以免引起用戶反感。

為了輔助開發者高效管理訂閱消息,市面上出現了多種工具。例如,微信官方提供了詳細的推送介面,包括獲取模板ID、獲取下發許可權和調用介面下發訂閱消息等步驟。此外,還有第三方平台如「阿拉丁小神推」,提供了從選擇模板、配置觸發、收集數據、創建推送,到統計效果的一站式服務,方便開發者更好地管理訂閱消息。

總的來說,訂閱消息為開發者與用戶之間提供了更加靈活和可控的溝通渠道,有助於提升用戶體驗和提高用戶留存率。通過合理的策略和工具,開發者可以有效地利用訂閱消息功能,構建更加緊密的用戶關系。

② 舉例說明windows應用程序中消息傳遞是如何進行的

系統以messages的形式將輸入傳遞給窗口過程。消息可以被系統和應用程序產生。系統產生消息當每一次輸入事件發生,如當用戶敲鍵盤,移滑鼠,或者單擊滾動條。系統也用消息來響應由於應用程序引起的系統變化。如應用程序改變系統字體資源或者改變它的一個窗口。應用程序產生消息來讓他的窗口執行一些任務或者與其他應用程序的窗口通訊。

系統發送消息給窗口過程並傳遞4個參數,windows句柄, 消息標識符, 2個消息參數。系統使用窗體句柄來決定那個窗口過程來接受消息。

消息標識符以常量命名指出消息的含義。當窗口過程接收到消息,使用消息標識符決定如何處理消息。例如、WM_PAINT告訴窗口過程窗體客戶區被改變了需要重繪。

消息參數指定被窗口過程使用的數據和數據的位置。其含義和值取決於消息類型。消息參數可以包含一個整數, 標志位,一個指針等。 當消息不使用消息參數時,他們被設置位NULL。一個Window窗口過程必須根據消息標識符來決定如何解釋消息參數。

Message Types
This section describes the two types of messages:
· System-Defined Messages
· Application-Defined Messages
System-Defined Messages

當系統和應用程序通訊時,系統post和send系統定義消息。他使用消息來控制應用程序的操作,提供輸入和其他信息讓應用程序處理。應用程序也可以post或者send系統定義消息。

每一個系統定義消息由一個唯一的標識符與一致的常量以聲明消息的含義。例如 WM_PAINT 要求窗口繪制它的內容。

符號常量指定系統定義消息屬於的類別,常量的前綴指定處理解釋消息的窗體的類型。以下使一些前綴和他們相關的消息類別。

Prefix Message category
ABM Application desktop toolbar
BM Button control
CB Combo box control
CBEM Extended combo box control
CDM Common dialog box
DBT Device
DL Drag list box
DM Default push button control
DTM Date and time picker control
EM Edit control
HDM Header control
HKM Hot key control
IPM IP address control
LB List box control
LVM List view control
MCM Month calendar control
PBM Progress bar
PGM Pager control
PSM Property sheet
RB Rebar control
SB Status bar window
SBM Scroll bar control
STM Static control
TB Toolbar
TBM Trackbar
TCM Tab control
TTM Tooltip control
TVM Tree-view control
UDM Up-down control
WM General window

通用窗體消息覆蓋了很大一個信息和請求的范圍, 包括滑鼠鍵盤消息, 菜單對話框的輸入, 窗體產生與管理, 動態數據交換 (DDE).

Application-Defined Messages

應用程序可以產生自己用的消息或者與其他進程中窗體通訊。如果應用程序產生自己的消息,窗口過程接受並且必須提供合適的處理。

系統保留消息標識符的值在0x0000在0x03ff(WM_USER-1)范圍。這些值被系統定義消息使用。 應用程序不能使用這些值給自己的消息。

private window classes用0x0400(WM_USER)到0x7fff消息標識符

· If your application is marked version 4.0, you can use message-identifier values in the range 0x8000 (WM_APP) through 0xBFFF for private messages.

系統使用RegisterWindowMessage來注冊消息,返回一個消息標識符范圍在0XC000到0XFFFF,使用這個函數來保證整個系統范圍內是唯一的

Message Routing

系統有兩個方法將消息傳遞到窗口過程。Post一個消息到先進先出的消息隊列。系統定義的臨時內存對象。和直接 send消息到窗口過程。

被發送到消息隊列的消息稱做入隊消息,主要是由滑鼠鍵盤輸入,例如 WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_KEYDOWN, and WM_CHAR messages。還包括定時器, 刷新, 退出: WM_TIMER, WM_PAINT, and WM_QUIT。其他直接發送到窗口過程的消息被稱為 非入隊消息。

Queued Messages

系統可以顯示任何數量的窗體同一時間。為了傳遞滑鼠鍵盤消息到合適的窗口,系統使用消息隊列。

系統維護一個系統消息隊列和每一個GUI線程的消息隊列,為避免給non-GUI現成創建消息隊列,所有線程產生時並沒有消息隊列。僅當線程第一次調用GDI函數時,系統給線程創建一個消息隊列。只要用戶移動滑鼠,點擊滑鼠,敲鍵,驅動程序將其轉換為消息將他們放在系統消息隊列中。系統將他們從系統消息隊列中移走,檢查他們的目標窗口,然後將他們發送到創建目標窗口的線程的消息隊列。線程消息隊列接收由這個線程創建的所有窗口的滑鼠鍵盤消息。線程刪除消息系統調用窗口過程進行處理。

WM_PAINT是一個例外,系統總是將消息Post在消息隊列的末尾。這樣保證窗口以先進先出的順序接受消息。然而, 僅當沒有其他消息時WM_PAINT才被傳遞窗口過程。同一個窗口的多個 WM_PAINT被合並成一個 WM_PAINT 消息, 合並所有的無效區域到一個無效區域。合並WM_PAIN減少了刷新窗口的次數。

系統通過填充MSG結構並將它復制到消息隊列來發送消息到線程隊列。MSG結構包括:窗口句柄,消息標識符,兩個消息參數。 消息被posted的時間, 和滑鼠的位置。線程可以使用PostMessage和PostThreadMessage來給發送消息到自己消息隊列或者另一個線成的消息隊列。

應用程序可以使用GetMessage從消息隊列刪除消息。可以使用 PeekMessage來檢查一個消息而不刪除它。 這個函數將消息隊列的消息填充到MSG結構。

在從消息隊列刪除了一個消息,應用程序可以使用DispatchMessage使系統將消息發送到窗口過程來處理。DispatchMessage擁有一個指向由GetMessage或者PeekMessage填充的MSG結構的指針,傳遞窗口句柄,消息標識符,消息參數給窗口過程。但它並不傳遞消息發送的時間和滑鼠的位置,應用程序可以通過GetMessageTime和GetMessagePos來得到這些信息。

線程可以使用WaitMessage將控制交給其他線程當消息隊列中沒有他的消息隊烈時,這個函數掛起線程,並不返回,直到新的消息放置於消息隊列中。

你可以調用SetMessageExtraInfo函數來關聯一個值到當前線程的消息隊列。調用GetMessageExtraInfo來得到這個與最後一次通過GetMessage或者PeekMessaage獲得的消息關聯得值。

Nonqueued Messages

非入隊消息即直接發送到窗口過程的消息,繞過系統隊列和線程消息隊列。系統發送非入隊消息通知一個窗口事件,例如,當用戶激活一個新的應用程序窗口,系統發送WM_ACTIVATE, WM_SETFOCUS, and WM_SETCURSOR。這些消息通知窗口它被激活了,鍵盤輸入被直接傳遞到窗口,滑鼠在當前窗口內移動。 非入隊消息也可以由當應用程序調用系統函數產生。例如,當程序調用SetWindowPos系統發送WM_WINDOWPOSCHANGED消息。

一些函數也發送非入隊消息如 BroadcastSystemMessage, BroadcastSystemMessageEx, SendMessage, SendMessageTimeout, and SendNotifyMessage.

Message Handling

應用程序必須移除和處理被post到消息隊列的消息。單線程應用程序通常在WinMain使用消息循環來移除和分發消息到何時窗口過程來處理。多線程應用程序可以在每一個創建窗口的線程中中包含消息循環。

Message Loop
A simple message loop consists of one function call to each of these three functions: GetMessage, TranslateMessage, and DispatchMessage. Note that if there is an error, GetMessage returns -1 -- thus the need for the special testing.
Show Example
MSG msg;
BOOL bRet;

while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

GetMessage 函數從消息隊列獲得一個消息並將它復制到MSG結構。他返回一個非0值,除非遇到WM_QUIT消息。否則它返回0然後結束循環。In a single-threaded application, ending the message loop is often the first step in closing the application. 應用程序可以使用PostQuitMessage來結束自己的消息循環。通常在主窗口的WM_DESTROY消息中調用。

如果你將一個窗口句柄作為第二個參數傳入GetMessage,那麼只有指定窗口的的消息可以從隊列中獲得。GetMessage也可以從消息隊列中過濾消息只接受消息隊列中落在范圍內的消息。詳細見消息過濾。 一個線程循環必須包括TranslateMessage如果線程接受鍵盤的字元輸入。每一次用戶按鍵系統產生虛擬鍵消息,一個虛擬鍵消息包含虛擬鍵用來標志那個鍵被按下,並不是他的字元值,要獲得這個值消息循環必須調用TranslateMessage,用於將虛擬鍵轉換為字元消息WM_CHAR然後將它放回應用程序消息隊列。通過將它轉發到窗口過程,字元消息被刪除。

DispatchMessage 函數分發消息到MSG結構中的窗口句柄關聯的窗口過程。如果窗口句柄是HWND_TOPMOST,DispatchMessage分發消息到系統中的所有的top-level窗口的窗口過程。如果句柄是NULL,DispatchMessage不做任何事。

應用程序得主線程在初始化,創建至少一個窗口後啟動它的消息循環,一旦啟動消息循環持續從線程隊列中獲得消息,然後分發他們到合適的窗口。消息循環在通過GetMessage得到WM_QUIT並將他從隊列中刪除後結束。

一個消息都列僅需要一個消息循環, 即使程序包含很多窗口。DispatchMessage 總是分發消息到合適的窗口,這是因為MSG結構包含消息所屬的窗口的句柄。

你可以用各種方式修改消息循環。例如,從消息隊列獲得消息消息但不把他們分發到窗口中去。當應用程序發送一個消息但不指定窗口時是有用的。你可以用GetMessage獲得一個特定的消息,而保留其他消息在消息隊列。當你需要改變先進先出的順序時是有用的。

應用程序使用加速鍵必須將鍵盤消息轉換為WM_COMMAND消息。所以消息循環必須包括TranslateAccelerator函數。詳細信息參見加速鍵。

如果線程使用非模態對話框,消息循環必須包括 IsDialogMessage 以使非模態對話框獲得鍵盤輸入。

Window Procere

窗口過程是一個用於處理所有發送到這個窗口的消息的函數。任何一個窗口類都有一個窗口過程。同一個類的窗口使用同樣的窗口過程來響應消息。

系統發送消息給窗口過程將消息數據作為參數傳遞給他,窗口過程使用參數產生合適行為。

一個窗口過程通常不忽略消息,如果他不處理,它會將消息傳回到執行默認的處理。窗口過程通過調用DefWindowProc來做這個處理。窗口過程必須return一個值作為它的消息處理結果。大多數窗口只處理小部分消息和將其他的通過DefWindowProc傳遞給系統做默認的處理。

因為窗口過程是同一個類的窗口共享的,它可以為不同的窗口處理消息。通過檢查消息中的窗口句柄來找到被消息影響的窗口。詳細信息請看Window Proceres。

Message Filtering

應用程序可以從消息隊列選擇特定的消息。使用GetMessage或者PeekMessage並指定一個消息過濾器。這個過濾器是一個消息標識符的范圍或者是一個窗體句柄,或者兩者同時指定。GetMessage和PeekMessage使用過濾器來選擇從消息隊列中獲得那些消息。當應用程序要查找一個後入消息隊列的消息是很有用。

一個應用程序過濾消息時必須保證符合過濾條件的消息能被發送。例如應用程序在窗口中過濾WM_CHAR並不能得到鍵盤輸入,GetMessage並不返回。這將掛起應用程序。

Posting and Sending Messages

應用程序可以post和send消息,通過將消息復制到消息隊列即post消息,send消息將消息數據作為參數直接傳遞到窗口過程。
可以使用PostMessage來post消息,SendMessage,BroadcastSystemMessage, SendMessageCallback, SendMessageTimeout, SendNotifyMessage, or SendDlgItemMessage來send消息。

Posting Messages

應用程序post消息通知指定窗體執行任務。PostMessage可以創建MSG結構並將它Copy到消息隊列。消息循環最終捕獲消息並分發到合適的窗口過程。

給PostMessage傳遞一個NULL句柄不指定哪一個窗口,這個消息就被發送到當前線程消息隊列,應用程序必須在消息處理中處理這個消息。這是為整個應用程序發送消息的一個方法。

偶爾你可以使用HWND_TOPMOST 這個參數作為句柄參數向所有的top-level窗口發送消息。

當消息隊列滿的時候PostMessage並不發送消息,應用程序需要檢查PostMessage函數的返回值來確定消息是否被發送,或者沒有需要重發。

Sending Messages

通過Send消息來通知窗口過程立即執行任務。SendMessage將消息發送給指定窗口的窗口過程。函數將等待窗口過程處理完才返回一個消息結果。父窗口和子窗口通常使用Send消息來互相通訊。例如,一個父窗口擁有以一個文本框作為它的子窗口,它可以通過發送消息到子窗口來給文本框設置文字。子窗口也可將文字被用戶改變的消息發送給父窗口。

SendMessageCallback也將消息發送給指定窗口的窗口過程,但是他立即返回。在窗口過程處理完消息後,系統調用指定的回調函數,回調函數的詳細資料參見SendAsyncProc

偶爾,你可以發送消息系統中到所有的top-level窗口,例如,應用程序改變了系統時間。它必須以HWND_TOPMOST作為句柄參數發送一個WM_TIMECHANGE 消息通知所有的top-level窗口,你也可以將lpdwRecipients 指定為BSM_APPLICATIONS 用BroadcastSystemMessage函數向所有應用程序廣播。

可以使用InSendMessage或者InSendMessageEx函數,窗口過程可以判斷它處理的消息是否是由其他線程調用SendMessage發送過來的。This capability is useful when message processing depends on the origin of the message.

Message Deadlocks

一個線程可以調用SendMessage想其他線程發送消息,這個線程不能繼續執行直到獲得消息得窗口過程返回。如果接受消息的線程處理消息時yields控制,發送線程的消息將永遠得不到執行,因為他在等待SendMessage返回。如果接受線程和發送線成語同一個消息隊列聯系起來,它可能導致消息死鎖。
Note that the receiving thread need not yield control explicitly; calling any of the following functions can cause a thread to yield control implicitly.
接受線程不需要明確yield控制,下面任何一個函數回導致一個線程明確yield控制。

· DialogBox
· DialogBoxIndirect
· DialogBoxIndirectParam
· DialogBoxParam
· GetMessage
· MessageBox
· PeekMessage
· SendMessage

為了避免潛在的死鎖,可以使用SendNotifyMessage 或者 SendMessageTimeout,否則窗口過程,將用InSendMessage或者InSendMessageEx判斷消息是否由另一個線程發送過來。當調用前面任何一個函數窗口過程將首先調用InSendMessage或者InSendMessagEx,如果函數返回true窗口過程必須在引起線程yeild控制前調用ReplyMessage 。

Broadcasting Messages

每一個消息包括消息標識符和兩個參數,wParam和lParam,消息標識符是唯一的代表這個消息的含義。參數提供與消息相關的額外的信息,但是wParam參數通常是一個類型值提供更多的消息信息。

消息廣播是簡單的將消息發送到系統中的多個接收者。使用BroadcastSystemMessage函數來廣播消息,你必須指定一個或者多個接收者類型,這些類型可以是applications, installable drivers, network drivers, and system-level device drivers。系統將消息發送給指定類型的所有成員。

系統廣播消息來響應系統設備驅動程序或者組件的變化。驅動程序或相關組件廣播消息給應用程序和其他組件以通知他們這些變化。例如,負責磁碟響應的組件廣播消息只要軟盤驅動程序發現媒體的變化,如當用戶將磁碟插入驅動器。

系統按一下順序廣播消息給接收者:系統級的設備驅動程序,網路驅動程序,installable drivers,和應用程序。意味著如果系統級設備驅動程序作為接收者總是第一個有機會來響應消息。在接受者類型中,沒有一個驅動程序能保證在其他驅動程序前接受一個消息。即一個給特定驅動程序的消息必須有一個全局唯一的標志使其他不關心這個消息的驅動程序不處理它。

你也可以廣播消息給所有頂層窗口通過在SendMessage等函數中指定HWND_BROADCAST。
應用程序通過頂層窗口的窗口過程來接收消息。消息不發送到子窗口。服務可以接收消息通過窗口過程或者他們的服務控制函數。

Query Messages

你可以創建自定義的消息使用它們來調整你的應用程序和其他組件之間的行為。這個非常有用如果你已創建你自己的installable drivers和系統機設備驅動程序。你的驅動程序和使用這個驅動程序的應用程序可以通過自定義消息互相傳遞信息。

To poll recipients for permission to carry out a given action, use a query message.你可以通過在dwFlags參數中設置BSF_QUERY調用BroadcastSystemMessage。每一個query message的接收者必須返回TRUE來將消息發送到下一個接收者。如果任何一個接收者返回BROADCAST_QUERY_DENY,廣播立即停止函數返回0。

Windows 95/98/Me: 你可以創建廣播和處理消息的installable drivers。一個installable drivers是一個導出DriverProc函數的dll。驅動程序通過它的DriverProc來接收消息。Installable drivers典型的用來支持多媒體設備,例如sound boards,也可以用於其他設備和目的。

Windows 95/98/Me: 網路驅動程序是給應用程序提供以下支持的dlls。系統級設備驅動程序是系統特定的提供直接訪問和管理計算機硬體的可執行組件。這些組件如何處理系統消息超出了這篇文章的范圍。

閱讀全文

與什麼程序轉發消息相關的資料

熱點內容
信息咨詢式培訓費用多少 瀏覽:762
女孩學習哪些技術比較好 瀏覽:768
有了ip地址怎麼掛代理 瀏覽:545
40年產權公寓交易稅怎麼算 瀏覽:970
寧波體檢信息哪裡查 瀏覽:160
數據線聯保是什麼意思 瀏覽:673
我國金融產品的市場有哪些 瀏覽:789
哪些東西可以碳交易 瀏覽:370
運單號上都有哪些信息 瀏覽:967
健美創妍產品怎麼樣 瀏覽:119
怎麼查看產品的upc 瀏覽:357
超數據世界遠程斗劍怎麼弄 瀏覽:101
家電清洗技術怎麼入門 瀏覽:771
語音識別技術有哪些 瀏覽:804
一樣的數據怎麼快速合並單元格 瀏覽:513
浙江英洛華有哪些技術領先產品 瀏覽:230
秀推產品有哪些 瀏覽:457
如何選擇原始的程序 瀏覽:384
中國郵政如何解除非櫃面交易 瀏覽:317
一張說胖就胖的臉是什麼產品 瀏覽:739