Delphi 如何修改EnumWindowNamesProc以使用Lazarus并将列表用作参数?

Delphi 如何修改EnumWindowNamesProc以使用Lazarus并将列表用作参数?,delphi,lazarus,Delphi,Lazarus,概述 我试图枚举所有可见窗口名的列表,然后填充作为参数传递的列表 在Delphi中,我能够通过以下方式实现这一点: function EnumWindowNamesProc(wHandle: HWND; List: TStrings): BOOL; stdcall; var Title: array[0..255] of Char; begin Result := False; GetWindowText(wHandle, Title, 255); if IsWindowVis

概述

我试图枚举所有可见窗口名的列表,然后填充作为参数传递的列表

在Delphi中,我能够通过以下方式实现这一点:

function EnumWindowNamesProc(wHandle: HWND; List: TStrings): BOOL; stdcall;
var
  Title: array[0..255] of Char;
begin
  Result := False;

  GetWindowText(wHandle, Title, 255);
  if IsWindowVisible(wHandle) then
  begin
    if Title <> '' then
    begin
      List.Add(string(Title));
    end;
  end;
  Result := True;
end;
但是我丢失了
列表
参数

我知道我可以修改代码并直接在函数中使用Listbox1,但我希望创建一个可重用的函数,不需要了解VCL/LCL控件,而是希望有一个更优雅的解决方案,只需传递一个基于
TStrings
的参数并添加到该参数中即可


问题:


所以我的问题是,在Delphi中,我能够将基于
TStrings
的参数传递给我的
EnumWindowNamesProc
,但在Lazarus中,它不会接受它。是否可能,如果可能,我如何修改代码,以便Lazarus接受
列表:TStrings
参数?

您可以。您不必丢失
列表

只需使用正确的参数和类型转换

function EnumWindowNamesProc(wHandle: HWND; List: LPARAM): BOOL; stdcall;
var
  Title: array[0..255] of Char;
begin
  Result := False;

  GetWindowText(wHandle, Title, 255);
  if IsWindowVisible(wHandle) then
  begin
    if Title <> '' then
    begin
      TStringList(List).Add(string(Title));
    end;
  end;
  Result := True;
end;

EnumWindows(@EnumWindowNamesProc, LPARAM(list));

你可以。您不必丢失
列表

只需使用正确的参数和类型转换

function EnumWindowNamesProc(wHandle: HWND; List: LPARAM): BOOL; stdcall;
var
  Title: array[0..255] of Char;
begin
  Result := False;

  GetWindowText(wHandle, Title, 255);
  if IsWindowVisible(wHandle) then
  begin
    if Title <> '' then
    begin
      TStringList(List).Add(string(Title));
    end;
  end;
  Result := True;
end;

EnumWindows(@EnumWindowNamesProc, LPARAM(list));

非常感谢,我从未想过在函数中键入LPRAM。一旦修复回调参数以匹配API声明,将其传递到
EnumWindows
时就不需要使用
@
。如果必须使用
@
来传递函数指针,则表示出现问题。(有时,这意味着Windows.pas中的API声明是错误的,但有时,这意味着您的回调声明是错误的,所以请检查。)@RobKennedy感谢您的提示,我认为我需要使用
@
操作符,因为在使用Delphi和Lazarus进行测试的过程中,Lazarus没有它就无法编译,我把它放在那里了。我将在Delphi中删除它进行测试,看看会发生什么,编译器可能会提供一些有用的信息。再次感谢您的提示。不确定FPC是否支持
absolute
,但您也可以声明
var列表:TStringList absolute Param
避免了强制转换,并使使用不同参数的重用变得非常容易。非常感谢,我从未想过在函数中强制转换LPRAM。一旦修复回调参数以匹配API声明,将其传递到
EnumWindows
时就不必使用
@
。如果必须使用
@
来传递函数指针,则表示出现问题。(有时,这意味着Windows.pas中的API声明是错误的,但有时,这意味着您的回调声明是错误的,所以请检查。)@RobKennedy感谢您的提示,我认为我需要使用
@
操作符,因为在使用Delphi和Lazarus进行测试的过程中,Lazarus没有它就无法编译,我把它放在那里了。我将在Delphi中删除它进行测试,看看会发生什么,编译器可能会提供一些有用的信息。再次感谢您的提示。不确定FPC是否支持
absolute
,但您也可以声明
var列表:TStringList absolute Param这避免了需要强制转换,并使使用不同参数的重用变得非常容易。
function EnumWindows(lpEnumFunc:Pointer; lParam:LPARAM):WINBOOL; external 'user32' name 'EnumWindows';