• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發(fā)教程 > 詳細頁面

        雖然不是.NET的,但對我們理解回調有幫助:如何控制其他程序窗體上的窗口控件:上

        雖然不是.NET的,但對我們理解回調有幫助:如何控制其他程序窗體上的窗口控件:上

        更新時間:2021-09-25 文章作者:未知 信息來源:網絡 閱讀次數(shù):

        如何控制其他程序窗體上的窗口控件:上

        首先申明:我是菜鳥,我只不過想把困繞了我很長時間的問題的解決方案發(fā)表出來,免得以后我又忘記,同時給還不知道這些小知識的同僚一些幫助。各位不要笑我的淺薄。同時為了表示我的低級,我會很羅嗦的講一些基本的東西,這些都是我的理解,很不準確。

        用我的方法來控制其他程序窗體上的窗口控件,必須先了解什么是回調函數(shù)。我的理解是這樣的:

        回調函數(shù)寫出來不是自己的程序去調用的,反而是讓其他的東西去調用,比如windows操作系統(tǒng),比如其他的程序等等之類的。但是什么時候被調用卻不知道了。回調函數(shù)一般是按照調用者的要求定義好參數(shù)和返回值的類型,你向調用者提供你的回調函數(shù)的入口地址,然后調用者有什么事件發(fā)生的時候就可以隨時按照你提供的地址調用這個函數(shù)通知你,并按照預先規(guī)定好的形式傳遞參數(shù)。所以很多人打比方,說回調函數(shù)還真有點像您隨身帶的BP機:告訴別人號碼,在它有事情時Call您!

        所以一個回調函數(shù)寫出來之后,一定有個注冊的動作,就是告訴調用者,你怎么樣找到我寫的函數(shù)。某些Windows API 函數(shù)會要求以回調函數(shù)地址作為其參數(shù)之一,例如SetTimer 、LineDDA 、EnumObjects,以及我們下面要用到的EnumWindows。

        在Delphi里聲明一個回調函數(shù)的格式很簡單,例如:

        function EnumWindowsProc(AhWnd:LongInt;lParam:LongInt):boolean;stdcall;

        首先是函數(shù)名稱可以隨便亂取,但函數(shù)參數(shù)的類型一般不得亂來,其順序,數(shù)據(jù)類型等都有規(guī)定的,因為這些都是讓其他程序調用的,他們已經規(guī)定好了的,但參數(shù)名稱可以隨便亂叫。注意后面一定要帶上“stdcall”,

        stdcall是標準調用,也就是說采用標準windows參數(shù)傳遞方式來調用函數(shù)。

        編寫函數(shù)體就很簡單了,利用傳遞過來的參數(shù)就可以了,只要記住,這些參數(shù)是別人送給你的,你只要知道這些參數(shù)代表了什么意思。

        再看個向調用者注冊回調函數(shù)入口地址的函數(shù)。
        function EnumWindows(lpEnumFunc: TFNWndEnumProc; lParam: LPARAM): BOOL; stdcall;

        TFNWndEnumProc其實就是指針類型。其中的lpEnumFunc就是回調函數(shù)的入口地址了。

        下面是調用EnumWindows的格式:
        EnumWindows(@EnumWindowsProc,0);

        通過向系統(tǒng)注冊回調函數(shù)的入口地址,系統(tǒng)就能在需要的時候,調用回調函數(shù),傳遞參數(shù)給它,也許這些參數(shù)就是我們想要的。

        EnumWindows函數(shù)的功能是:枚舉屏幕上所有程序中的頂層窗口,將窗口句柄以參數(shù)的形式傳遞給回調函數(shù)。找到一個窗口,就調用一次回調函數(shù)。枚舉結束的條件是:要么枚舉完所有的窗口,要么回調函數(shù)返回False。

        lParam: LPARAM參數(shù)是程序定義的值,這個值被傳遞到回調函數(shù)。

        回過頭來再看一下EnumWindowsProc:

        function EnumWindowsProc(AhWnd:LongInt;lParam:LongInt):boolean;stdcall;

        當系統(tǒng)找到了一個窗口后,就開始調用這個回調函數(shù),將窗口的句柄作為第一個參數(shù)傳遞過來,將在EnumWindows中l(wèi)Param: LPARAM這個程序定義的值作為第二個參數(shù)傳遞過來。

        所以我們可以在EnumWindowsProc函數(shù)中利用傳遞過來的兩個參數(shù)來做某些處理了。

        下面我們新建一個程序列舉系統(tǒng)中所有程序的頂層窗口,我們要得到窗口的標題,要得到窗口類名稱。

        得到窗口標題用:

        function GetWindowText(hWnd: HWND; lpString: PChar; nMaxCount: Integer): Integer; stdcall;

        該函數(shù)功能是將窗口句柄為hWnd的窗口的標題拷入到一個緩沖區(qū)lpString。nMaxCount是拷入緩沖區(qū)內的最大的字符數(shù)。

        要得到窗口標題還可以發(fā)送消息:WM_GETTEXT,其實GetWindowText就是發(fā)送WM_GETTEXT消息的。

        要得到窗口類名稱用:

        function GetClassName(hWnd: HWND; lpClassName: PChar; nMaxCount: Integer): Integer; stdcall;

        其參數(shù)意義和上面的函數(shù)差不多。不詳細解釋了。

        我們先編寫回調函數(shù):EnumWindowsProc。現(xiàn)在告訴自己,我們已經有了兩個參數(shù)的值了。這兩個參數(shù)是系統(tǒng)給我們的.

        為了顯示窗口標題和類名,我們用一個TMemo控件。

        先在interface部分聲明函數(shù)。

        function EnumWindowsProc(AhWnd:LongInt;AForm:TForm1):boolean;stdcall;

        注意我將第二個參數(shù)改了,不要緊,到時候調用的時候注意看。

        然后在implementation部分定義函數(shù):
        function EnumWindowsProc(AhWnd:LongInt;AForm:TForm1):boolean;
        var
        lpszClassName,lpszWindowText:array[0..254] of char;//定義兩個緩沖區(qū)。
        begin
        GetWindowText(AhWnd,lpszWindowText,254); //得到窗口標題
        GetClassName(AhWnd,lpszClassName,254); //得到窗口類名。
        Aform.memo1.lines.add(StrPas(lpszWindowText));
        Aform.memo1.lines.add(StrPas(lpszClassName));
        Aform.memo1.lines.add('--------------------');
        Result:=True;
        end;

        接著需要做的就是調用EnumWindows函數(shù),注冊回調函數(shù)入口地址,讓系統(tǒng)調用回調函數(shù),列舉窗口了。所以再添加一個TButton: btn_listwindow
        procedure TForm1.btn_listwindowClick(Sender: TObject);
        begin
        EnumWindows(@EnumWindowsProc,LongInt(self));
        end;

        程序清單如下:
        unit Unit1;

        interface

        uses
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
        Dialogs, StdCtrls;

        type
        TForm1 = class(TForm)
        Memo1: TMemo;
        btn_listwindow: TButton;
        procedure btn_listwindowClick(Sender: TObject);
        private
        { Private declarations }
        public
        { Public declarations }
        end;

        var
        Form1: TForm1;

        function EnumWindowsProc(AhWnd:LongInt;AForm:TForm1):boolean;stdcall;

        implementation
        {$R *.dfm}
        function EnumWindowsProc(AhWnd:LongInt;AForm:TForm1):boolean;
        var
        lpszClassName,lpszWindowText:array[0..254] of char;
        begin
        GetWindowText(AhWnd,lpszWindowText,254);
        GetClassName(AhWnd,lpszClassName,254);
        Aform.memo1.lines.add(StrPas(lpszWindowText));
        Aform.memo1.lines.add(StrPas(lpszClassName));
        Aform.memo1.lines.add('--------------------');
        Result:=True;
        end;

        procedure TForm1.btn_listwindowClick(Sender: TObject);
        begin
        EnumWindows(@EnumWindowsProc,LongInt(self));
        end;

        end.
        F9,運行,看看結果。最好是F7單步跟蹤調試一下,看看回調函數(shù)是怎么被調用的。

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 亚洲伊人久久大香线蕉在观| 亚洲国产成人久久综合碰碰动漫3d| 亚洲香蕉在线观看| 欧洲精品99毛片免费高清观看| 亚洲午夜久久久久久久久电影网| 一级做a爰片久久毛片免费陪| 亚洲国产人成中文幕一级二级| 最新亚洲人成网站在线观看| www.亚洲色图| 免费的黄网站男人的天堂| 亚洲精品99久久久久中文字幕| 男人j进女人p免费视频| 亚洲精品视频在线看| 丁香花在线视频观看免费| 亚洲国产美国国产综合一区二区 | 久久精品无码精品免费专区| 亚洲精品中文字幕无码蜜桃| 国产精品区免费视频| 亚洲黄色在线网站| 最新仑乱免费视频| 成人a毛片免费视频观看| 亚洲午夜未满十八勿入网站2| 免费黄网站在线观看| 亚洲视频在线不卡| 女人18毛片水真多免费播放| 美女无遮挡免费视频网站| 亚洲中文字幕无码久久2017| 4444www免费看| 亚洲AV综合永久无码精品天堂| 亚洲欧洲中文日韩久久AV乱码| 久久精品成人免费网站| 亚洲中文字幕久久久一区| 亚洲免费视频一区二区三区| 黄网站免费在线观看| 亚洲AV日韩综合一区尤物| 国产成人亚洲综合| 福利免费观看午夜体检区| 一级免费黄色大片| 亚洲伊人色一综合网| 亚洲第一黄色网址| 久久久久久久免费视频|