乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       frie 2005-08-09
       

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

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

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

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

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

      在Delphi里聲明一個(gè)回調(diào)函數(shù)的格式很簡(jiǎn)單,例如:

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

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

      stdcall是標(biāo)準(zhǔn)調(diào)用,也就是說采用標(biāo)準(zhǔn)windows參數(shù)傳遞方式來調(diào)用函數(shù)。

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

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

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

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

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

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

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

      回過頭來再看一下EnumWindowsProc:

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

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

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

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

      得到窗口標(biāo)題用:

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

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

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

      要得到窗口類名稱用:

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

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

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

      為了顯示窗口標(biāo)題和類名,我們用一個(gè)TMemo控件。

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

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

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

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

      接著需要做的就是調(diào)用EnumWindows函數(shù),注冊(cè)回調(diào)函數(shù)入口地址,讓系統(tǒng)調(diào)用回調(diào)函數(shù),列舉窗口了。所以再添加一個(gè)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,運(yùn)行,看看結(jié)果。最好是F7單步跟蹤調(diào)試一下,看看回調(diào)函數(shù)是怎么被調(diào)用的。

       

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多