0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Windows消息機(jī)制模擬用戶輸入的方法介紹

冬至子 ? 來源:活魚格勒 ? 作者:鬼人揚(yáng) ? 2023-09-07 10:59 ? 次閱讀

Windows 消息機(jī)制API

xiaoxi guanli jizhi

Windows平臺(tái)上的應(yīng)用程序是事件驅(qū)動(dòng)的 ,它們不會(huì)顯式地調(diào)用底層函數(shù)以獲得用戶輸入或其它信息,而是等待系統(tǒng)將這些信息提供給它們。同類定義的窗口向系統(tǒng)聲明一個(gè)唯一的 窗口過程函數(shù) (Window Procedures)。當(dāng)有關(guān)某一窗口句柄的事件發(fā)生時(shí)(比如:鼠標(biāo)單擊這個(gè)窗口,或鍵盤向這個(gè)窗口輸入一個(gè)字符),系統(tǒng)調(diào)用這個(gè)函數(shù),把某個(gè)特定的消息作為參數(shù)。

要向特定的窗口過程發(fā)送消息,Windows提供了以下函數(shù):

圖片

由于lpPrevWndFunc為同一類窗口共有,發(fā)送的消息在被某一窗口處理前事實(shí)上可能已被多個(gè)窗口接收。本文不會(huì)用到這一函數(shù),關(guān)于此函數(shù)的完整定義請(qǐng)參閱:

圖片

這一函數(shù)在中定義,它向唯一的窗口句柄發(fā)送消息,并只在發(fā)送的消息被處理后返回。與之相似的是PostMessageW,它在發(fā)送消息后立即返回,即只將消息添加到目的窗口句柄的消息隊(duì)列里,并不等待其處理。

HWND hwnd:接收消息的窗口句柄

(特別地(HWND)0xffff為廣播)

UINT Msg:發(fā)送的消息類型

WPARAM wParam:發(fā)送的消息

LPARAM lParam:發(fā)送消息的附加參數(shù)

實(shí)現(xiàn)刷屏

mian dui dui xiang

獲得Windows提供的API函數(shù)后,下面用C++實(shí)現(xiàn)。

首先將刷屏過程封裝到一個(gè)類中

--------Bomb.h--------

圖片

構(gòu)造類時(shí)向構(gòu)造函數(shù)提供刷屏消息的重復(fù)次數(shù)和刷屏消息 (UTF-16格式)

ShowMessage()用于調(diào)試,把當(dāng)前類保存的消息輸出到控制臺(tái)上

StartBombing(int)用于開始刷屏,參數(shù)定義開始刷屏前的延時(shí)。用戶可在這段延時(shí)內(nèi)把鍵盤焦點(diǎn)設(shè)置到目標(biāo)窗口上去,使目標(biāo)窗口句柄或得消息后把消息內(nèi)容加入到文本輸入框中去。此函數(shù)有一個(gè)無延遲參數(shù)的重載。

消息內(nèi)容存儲(chǔ)在私有段中一個(gè)類型為WPARAM的數(shù)組中(該類型在上文中有介紹),附加消息是一個(gè)值為NULL的LPARAM類型——實(shí)現(xiàn)本例中的功能不需要向SendMessageW()提供附加消息。

--------Bomb.cpp--------

圖片

圖片

出于某些考量,我們?cè)诖瞬惶峁┲饕瘮?shù)的定義。在StartBombing()中,程序按用戶設(shè)定的刷屏消息重復(fù)次數(shù)循環(huán)times次,并按消息長(zhǎng)度循環(huán)MessageLength,每次將消息字符串中的第j個(gè)字符以WH_CHAR模式向所有窗口廣播。獲得鍵盤輸入焦點(diǎn)的窗口會(huì)將其加入到文本框中。

在發(fā)送完一條消息后,通過keybd_event函數(shù)模擬一次【回車鍵按下】事件,使目標(biāo)窗口(比如:wechat)發(fā)送消息或換行。

--------Main.cpp--------

圖片

這是應(yīng)用程序入口點(diǎn)。注意它設(shè)置了wcout/wcin的本地化,使其將儲(chǔ)存在WPARAM類型(其本質(zhì)是unsigned int)中的UTF-16數(shù)據(jù)轉(zhuǎn)化為中文字符輸出/輸入。

可見,按以上代碼編譯的應(yīng)用程序已經(jīng)可以完成質(zhì)問馬人王的任務(wù)。然而, 這速度也太慢了?? 這個(gè)速度比打字快不了多少,如果這樣的話就沒必要用刷屏軟件了。哪里出了問題呢?

問題在于,如本文開頭介紹:SendMessageW()強(qiáng)制在目標(biāo)窗口過程將消息處理完畢后才返回,這使得整個(gè)過程變得相當(dāng)緩慢。

解決方法是顯而易見的:用PostMessageW()取代原函數(shù)。但是這樣做會(huì)帶來新的問題:Post函數(shù)只是簡(jiǎn)單地把消息加入到目標(biāo)的消息隊(duì)列去,之后立即返回。而原程序在Post/Send函數(shù)返回后會(huì)調(diào)用keybd_event()模擬一個(gè)鍵盤事件。然而,窗口過程處理消息的速度現(xiàn)在看來并不盡如人意,這往往會(huì)導(dǎo)致大量字符消息堆積在消息隊(duì)列中,最終導(dǎo)致鍵盤事件和消息發(fā)送間不協(xié)調(diào)(比如:微信PC端輸入框中堆積了很多信息而不發(fā)送,因?yàn)榛剀囨I按下事件沒有按正常順序處理)

所以,要兼顧消息的穩(wěn)定性和發(fā)送速度,就要把keybd_event替換成另一個(gè)PostMessageW(),使【回車鍵按下】這一事件也像其它字符事件那樣加入到消息隊(duì)列中去,這樣就能保證字符消息和回車間的先后順序不變。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)器
    +關(guān)注

    關(guān)注

    38

    文章

    7430

    瀏覽量

    163517
  • WINDOWS
    +關(guān)注

    關(guān)注

    3

    文章

    3521

    瀏覽量

    88317
  • C++語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    6951
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    PCB設(shè)計(jì)高速模擬輸入信號(hào)走線方法及規(guī)則

    本文主要詳解PCB設(shè)計(jì)高速模擬輸入信號(hào)走線,首先介紹了PCB設(shè)計(jì)高速模擬輸入信號(hào)走線方法,其次闡
    發(fā)表于 05-25 09:06 ?9016次閱讀
    PCB設(shè)計(jì)高速<b class='flag-5'>模擬</b><b class='flag-5'>輸入</b>信號(hào)走線<b class='flag-5'>方法</b>及規(guī)則

    模擬輸入信號(hào)的保護(hù)電路

    本文介紹了四種模擬輸入信號(hào)的保護(hù)電路的實(shí)現(xiàn)方法。
    發(fā)表于 09-07 10:38 ?1760次閱讀

    四種模擬輸入信號(hào)的保護(hù)電路實(shí)現(xiàn)方法

    本文介紹了四種模擬輸入信號(hào)的保護(hù)電路的實(shí)現(xiàn)方法。
    發(fā)表于 03-28 09:55 ?1118次閱讀

    如何破解windows xp 用戶密碼

    ”命令把xpuser01這個(gè)用戶升為超級(jí)用戶,即可擁有所有權(quán)限。5.最后一步,就是重新啟動(dòng)計(jì)算機(jī),在登錄窗口中輸入剛剛更改的新密碼便可成功登陸。如果你正在為丟失了登陸口令而煩惱的話,不妨試一試此
    發(fā)表于 09-14 11:59

    Windows XP系統(tǒng)隱藏硬盤的方法和技巧

    Windows XP系統(tǒng)隱藏硬盤的方法和技巧 簡(jiǎn)單有效的方法就是把存有許多重要文件夾的硬盤分區(qū)全部隱藏起來。下面以在Windows XP系統(tǒng)中隱藏D盤為例
    發(fā)表于 03-19 15:07

    Windows 7最新安裝方法大全

    Windows 7最新安裝方法大全  Windows 7安裝方法可分為:光盤安裝法、模擬光驅(qū)
    發(fā)表于 01-18 09:56 ?523次閱讀

    Windows系統(tǒng)用戶擺脫黑客攻擊的方法

    Windows系統(tǒng)用戶擺脫黑客攻擊的方法 IP被盜用是指盜用者使用未經(jīng)授權(quán)的IP來配置網(wǎng)上的計(jì)算機(jī)。目前IP盜用行為非常常見,許多“不法之徒”用盜用
    發(fā)表于 01-27 10:06 ?602次閱讀

    三種單片機(jī)模擬串口方法介紹

    三種單片機(jī)模擬串口方法介紹 模擬串口就是利用51的兩個(gè)輸入輸出引腳如P1.0和P1.1,置1或0分別代表高低電平,也就是串口通信中所說的位
    發(fā)表于 02-27 10:41 ?4930次閱讀

    WINDOWS_XP藍(lán)牙虛擬串口設(shè)置方法

    WINDOWS_XP藍(lán)牙虛擬串口設(shè)置方法,可將藍(lán)牙模擬成串口進(jìn)行通訊。
    發(fā)表于 11-10 16:11 ?0次下載

    Windows8圖文介紹

    計(jì)算機(jī)基礎(chǔ) Windows 8主要操作及使用方法圖文介紹。
    發(fā)表于 12-16 14:41 ?0次下載

    MFC中Windows消息處理機(jī)制解析

    Windows程序和DOS程序的主要不同點(diǎn)之一是:Windows程序是以事件為驅(qū)動(dòng)、消息機(jī)制為基礎(chǔ) 本人對(duì)Windows系統(tǒng)、MFC談不上有深入的了解,但對(duì)MFC本身包裝API的
    發(fā)表于 11-07 10:36 ?1次下載

    模擬信號(hào)中高斯噪聲對(duì)ADC輸入的影響介紹

    本文介紹模擬信號(hào)中高斯噪聲對(duì)ADC輸入的影響。
    發(fā)表于 11-23 15:34 ?11次下載
    <b class='flag-5'>模擬</b>信號(hào)中高斯噪聲對(duì)ADC<b class='flag-5'>輸入</b>的影響<b class='flag-5'>介紹</b>

    PLC模擬輸入濾波方法以及優(yōu)缺點(diǎn)的介紹

    輸入濾波通常是限幅濾波、中值濾波、算術(shù)平均濾波、遞歸平均濾波、中值平均濾波、極限平均濾波、一階滯后濾波、加權(quán)遞歸平均濾波、抖動(dòng)濾波和極限抖動(dòng)濾波。本文比較介紹了plc模擬輸入濾波
    發(fā)表于 12-13 13:51 ?1760次閱讀

    模擬輸入輸出模塊用戶手冊(cè)(詳細(xì)篇)

    本手冊(cè)介紹 MELSEC-Q 系列對(duì)應(yīng) Q64AD2DA 型模擬輸入輸出模塊 ( 以下簡(jiǎn)稱為 Q64AD2DA) 的 規(guī)格、使用、編程方法等有關(guān)內(nèi)容。
    發(fā)表于 08-25 14:47 ?4次下載
    <b class='flag-5'>模擬</b><b class='flag-5'>輸入</b>輸出模塊<b class='flag-5'>用戶</b>手冊(cè)(詳細(xì)篇)

    python控制windows窗口,并輸入數(shù)據(jù)

    于實(shí)現(xiàn)許多應(yīng)用程序,包括控制Windows窗口以及進(jìn)行數(shù)據(jù)輸入。 本文將以Windows平臺(tái)為例,詳細(xì)介紹如何使用Python來控制窗口和實(shí)現(xiàn)數(shù)據(jù)
    的頭像 發(fā)表于 11-22 14:11 ?2907次閱讀