天天看點

WinAPI: FindWindow、FindWindowEx - 查找視窗

FindWindow(

  lpClassName,        {視窗的類名}

  lpWindowName: PChar {視窗的标題}

): HWND;              {傳回視窗的句柄; 失敗傳回 0}

//FindWindowEx 比 FindWindow 多出兩個句柄參數:

FindWindowEx(

  Parent: HWND;     {要查找子視窗的父視窗句柄}

  Child: HWND;      {子視窗句柄}

  ClassName: PChar; {}

  WindowName: PChar {}

): HWND;

{

如果 Parent 是 0, 則函數以桌面視窗為父視窗, 查找桌面視窗的所有子視窗;

如果  是 HWND_MESSAGE, 函數僅查找所有消息視窗;

子視窗必須是 Parent 視窗的直接子視窗;

如果 Child 是 0, 查找從 Parent 的第一個子視窗開始;

如果 Parent 和 Child 同時是 0, 則函數查找所有的頂層視窗及消息視窗.

}

//測試1: 試着找找建立程式主視窗的句柄

var

  h: HWND;

begin

  {現在我們知道視窗的标題是: Form1、視窗的類名是: TForm1}

  h := FindWindow( 'TForm1' , 'Form1' );

  ShowMessage(IntToStr(h));      {656180; 這是随機, 每次啟動視窗肯定不一樣}

  {假如不知道類名}

  h := FindWindow( nil, 'Form1' );

  ShowMessage(IntToStr(h));      {656180}

  {假如不知道标題名}

  h := FindWindow( 'TForm1' , nil);

  ShowMessage(IntToStr(h));      {656180}

  {其實這個視窗的句柄不就是 Self.Handle 嗎}

  ShowMessage(IntToStr(Handle)); {656180}

end;

//測試2: 找電腦視窗的句柄(先打開電腦)

var

  h: HWND;

begin

  {如果不是簡體中文系統, 這樣可能不靈}

  h := FindWindow( nil, '電腦' );

  ShowMessage(IntToStr(h)); {1508334}

  {最好這樣, 但你得提前知道電腦視窗的類名是: SciCalc}

  h := FindWindow( 'SciCalc' , nil);

  ShowMessage(IntToStr(h)); {1508334}

end;