type
  TWinInfo = class(TObject)
    WindowName: string;
    WindowClass: string;
  end;function EnumWindowsProc(hw: Hwnd; Form3: TForm3): boolean; stdcall;
var
  WinName, CName: array[0..144] of Char;
  WinInfo: TWinInfo;
begin
  Result:= true;
  GetWindowText(hw, WinName, 144);
  GetClassName(hw, CName, 144);
  WinInfo:= TWinInfo.Create;
  with WinInfo do
  begin
    SetLength(WindowName, StrLen(WinName));
    SetLength(WindowClass, StrLen(CName));
    WindowName:= StrPas(WinName);
    WindowClass:= StrPas(CName);
  end;
  form3.Label1.Caption:= wininfo.WindowName;////
end;procedure TForm3.GetWinInfoClick(Sender: TObject);
begin
  EnumWindows(@EnumWindowsProc, 0);
end;
单击GetWinInfo时,执行到上面 //// 的地方错误。
请问这是怎么回事?怎么解决?

解决方案 »

  1.   

    form3.Label1.Caption:= string(wininfo.WindowName)//试试
      

  2.   

    To cg1120(代码最优化-§新年祝福你,好运伴着你§) :
    这样也不行,我试过了。
    如果把出错的这句
    form3.Label1.Caption:= wininfo.WindowName;////
    屏蔽掉,程序就没问题。
      

  3.   

    lbWinInfo: TListBox;
    我原先是用下面这句,如
    Form3.lbWinInfo.Items.AddObject('', WinInfo);
    出错后用
    form3.Label1.Caption:= wininfo.WindowName;代替测试也不行。
      

  4.   

    form3根本不存在阿!
    form3.Label1.Caption:= wininfo.WindowName;////这句中的form3是(hw: Hwnd; Form3: TForm3)中定义的行参Form3而不是当前运行的窗体。此时form3=nil.—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  5.   

    用EnumWindows(@EnumWindowsProc, Integer(Self));调用就行了。—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————