VC++中FindWindow函数的学习

来源:互联网 发布:codeblocks linux 编辑:程序博客网 时间:2024/05/16 10:31

配合sendmessage 。postmessage使用
static CWnd* PASCAL FindWindow( LPCTSTRlpszClassName, LPCTSTRlpszWindowName );

Return Value

标识了具有指定的类名或窗口名的窗口。如果没有找到这样的窗口,则返回NULL。

返回的CWnd*值可能是临时的,不能被保存以供将来使用。

举个例子:

假如当下载数据完成的时候自动关闭"进度条"窗口,在多线程下载数据完成后加入以下代码:

第一个方法:

CWnd* m_pWnd=FindWindow(NULL,"进度条");

if(m_pWnd)

{

::PostMessage(m_pWnd->m_hWnd,WM_CLOSE,0,0);//强迫退出

}

第二个方法:①在进度条窗体对象中,加入一个public类型的void OnClose函数.如下:

void CDDdlg::OnClose()

{

OnOK();

}

②在下载结束后的程序后面加入,注:生命进度条窗口 CDDdlg dlg;

{

dlg.OnClose();

}

 

FindWindow(
  lpClassName,        {窗口的类名}
  lpWindowName: PChar {窗口的标题}
): HWND;              {返回窗口的句柄; 失败返回 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;


0 0