国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

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

2019-11-18 18:43:24
字體:
供稿:網(wǎng)友
 

有了回調(diào)函數(shù)的概念及上面的例子,我們可以繼續(xù)了。其實(shí)想要找到一個(gè)標(biāo)題已知的窗口句柄,用一個(gè)API函數(shù)就可以了:FindWindow.

其函數(shù)原形是:

function FindWindow(lpClassName, lpWindowName: PChar): HWND; stdcall;

lpClassName:窗口類名.如果只知道標(biāo)題,可以為空.窗口類名可以用很多工具獲得.如winsignt32.
lpWindowName:窗口標(biāo)題.

調(diào)用方式舉例:

var wndhwnd:HWND;
wndhwnd:=FindWindow(nil,'某窗口標(biāo)題');
if wndhwnd<>0 then  file://找到此窗口句柄.
begin
  xxxxx
end
else begin
  MessageBox(self.handle,'沒找到該窗口句柄','提示',0);
end;

有了這個(gè)窗口句柄,就離我們的初始目的不遠(yuǎn)了:控制其他窗體上的窗口控件.

同樣,首先要得到其他窗體上窗口控件的句柄.我們用這個(gè)API函數(shù):EnumChildWindows.

其函數(shù)原形是:
function EnumChildWindows(hWndParent: HWND; lpEnumFunc: TFNWndEnumPRoc;
  lParam: LPARAM): BOOL; stdcall;

這個(gè)函數(shù)和EnumWindow函數(shù)很有些想象.其作用也很相似.它的功能就是列舉窗口句柄為hWndParent的窗體上所有的窗口控件的句柄.同樣也是以回調(diào)函數(shù)參數(shù)的形式給出的.

我們?cè)倥e一個(gè)實(shí)際的例子,來說明這個(gè)函數(shù)的用法.程序的功能是讓用戶輸入一個(gè)窗口標(biāo)題,然后調(diào)用FindWindow函數(shù)找到此窗口句柄.通過這個(gè)句柄,我們?cè)谝粋€(gè)Memo里顯示該窗口上所有的窗口控件.

同樣先編寫回調(diào)函數(shù).
function  EnumChildWndProc(AhWnd:LongInt;
  AlParam:lParam):boolean;stdcall;
var
  WndClassName: array[0..254] of Char;
  WndCaption: array[0..254] of Char;
begin
  GetClassName(AhWnd,wndClassName,254);
  GetWindowText(aHwnd,WndCaption,254);
  with form1.memo1 do
  begin
    lines.add( string(wndClassName));
    lines.add( string(wndCaption));
    lines.add('-------');
  end;
  result:=true;
end;


然后在一事件里調(diào)用EnumChildWindows函數(shù).
procedure TForm1.Button1Click(Sender: TObject);
var
  hWnd:LongInt;
begin
  memo1.Lines.Clear;
  Memo1.Lines.Add(Edit1.Text+' 有如下控件類名稱');
  hWnd:=FindWindow(nil,pchar(Edit1.Text));
  if hWnd<>0 then
  begin
    EnumChildWindows(hWnd,@EnumChildWndProc,0);
  end
  else  MessageBox(self.handle,'沒找到該窗口句柄','提示',0);
end;

程序清單如下:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;  file://用來顯示找到的控件
    Label1: TLabel; 
    Edit1: TEdit;  file://輸入標(biāo)題.
    Button1: TButton; 
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  function  EnumChildWndProc(AhWnd:LongInt;
    AlParam:lParam):boolean;stdcall;

implementation


{$R *.dfm}
function  EnumChildWndProc(AhWnd:LongInt;
  AlParam:lParam):boolean;stdcall;
var
  WndClassName: array[0..254] of Char;
  WndCaption: array[0..254] of Char;
begin
  GetClassName(AhWnd,wndClassName,254);
  GetWindowText(aHwnd,WndCaption,254);
  with form1.memo1 do
  begin
    lines.add( string(wndClassName));
    lines.add( string(wndCaption));
    lines.add('-------');
  end;
  result:=true;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  hWnd:LongInt;
begin
  memo1.Lines.Clear;
  Memo1.Lines.Add(Edit1.Text+' 有如下控件類名稱');
  hWnd:=FindWindow(nil,pchar(Edit1.Text));
  if hWnd<>0 then
  begin
    EnumChildWindows(hWnd,@EnumChildWndProc,0);
  end
  else  MessageBox(self.handle,'沒找到該窗口句柄','提示',0);
end;

end.


有了控件句柄,我們當(dāng)然就可以隨心所欲了.比如:

SendMessage(hWnd,WM_SETTEXT,0,LongInt(Pchar('sdafdsf')));就可以給控件發(fā)送文本.其他還可以發(fā)送不同的消息可以做很多事情.

但是,有很大一個(gè)問題:假設(shè)一個(gè)窗體上有很多相同的控件,并且根本沒辦法區(qū)分他們,即使我們能找到所有的控件句柄,我們又不能區(qū)分到底哪個(gè)是我們想要的,同樣是干著急.

我想了很長時(shí)間,后來在大富翁里找到了答案,只要用到一個(gè)小技巧,就可以解決了.


上一篇:全透明窗體(效果比較好)

下一篇:防止關(guān)閉windows

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 呼玛县| 甘洛县| 昌吉市| 宜兰市| 绍兴市| 望都县| 湘潭县| 益阳市| 平潭县| 九寨沟县| 黄山市| 资源县| 高密市| 巩留县| 肥城市| 绥中县| 泗水县| 行唐县| 称多县| 武宣县| 澄江县| 云安县| 宜兴市| 鲜城| 亚东县| 河北省| 乾安县| 海南省| 琼海市| 陇川县| 西和县| 宁夏| 和林格尔县| 塘沽区| 松桃| 基隆市| 内乡县| 元朗区| 磐石市| 五原县| 绍兴市|