如何控制其他程式表單上的視窗控制項

來源:互聯網
上載者:User

 

用我的方法來控制其他程式表單上的視窗控制項,必須先瞭解什麼是回呼函數。我的理解是這樣的:

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

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

在Delphi裡聲明一個回呼函數的格式很簡單,例如:

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

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

stdcall是標準調用,也就是說採用標準windows參數傳遞方式來調用函數。

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

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

TFNWndEnumProc其實就是指標類型。其中的lpEnumFunc就是回呼函數的入口地址了。

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

通過向系統註冊回呼函數的入口地址,系統就能在需要的時候,調用回呼函數,傳遞參數給它,也許這些參數就是我們想要的。

EnumWindows函數的功能是:枚舉螢幕上所有程式中的頂層視窗,將視窗控制代碼以參數的形式傳遞給回呼函數。找到一個視窗,就調用一次回呼函數。枚舉結束的條件是:要麼枚舉完所有的視窗,要麼回呼函數返回False。

lParam: LPARAM參數是程式定義的值,這個值被傳遞到回呼函數。

回過頭來再看一下EnumWindowsProc:

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

當系統找到了一個視窗後,就開始調用這個回呼函數,將視窗的控制代碼作為第一個參數傳遞過來,將在EnumWindows中lParam: LPARAM這個程式定義的值作為第二個參數傳遞過來。

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

下面我們建立一個程式列舉系統中所有程式的頂層視窗,我們要得到視窗的標題,要得到視窗類別名稱。

得到視窗標題用:

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

該函數功能是將視窗控制代碼為hWnd的視窗的標題拷入到一個緩衝區lpString。nMaxCount是拷入緩衝區內的最大的字元數。

要得到視窗標題還可以發送訊息:WM_GETTEXT,其實GetWindowText就是發送WM_GETTEXT訊息的。

要得到視窗類別名稱用:

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

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

我們先編寫回呼函數:EnumWindowsProc。現在告訴自己,我們已經有了兩個參數的值了。這兩個參數是系統給我們的.

為了顯示視窗標題和類名,我們用一個TMemo控制項。

先在interface部分聲明函數。

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

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

然後在implementation部分定義函數:

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;

接著需要做的就是調用EnumWindows函數,註冊回呼函數入口地址,讓系統調用回呼函數,列舉視窗了。所以再添加一個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單步跟蹤調試一下,看看回呼函數是怎麼被調用的。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.