gpt4 book ai didi

delphi - 如何调用 EnumWindowsProc?

转载 作者:行者123 更新时间:2023-12-03 15:05:12 25 4
gpt4 key购买 nike

我正在尝试列出我的计算机上所有正在运行的进程。

我的简短示例代码中的 EnumWindowsProc() 调用语句有什么问题。我的编译器声称,在这一行中:

EnumWindows(@EnumWindowsProc, ListBox1);

函数调用中需要有一个变量。我应该如何将 @EnumWindowsProc 更改为 var ?

unit Unit_process_logger;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.ExtCtrls, Vcl.StdCtrls;

type
TForm1 = class(TForm)
ListBox1: TListBox;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

function EnumWindowsProc(wHandle: HWND; lb: TListBox): Boolean;

var
Form1: TForm1;

implementation

{$R *.dfm}

function EnumWindowsProc(wHandle: HWND; lb: TListBox): Boolean;
var
Title, ClassName: array[0..255] of Char;
begin
GetWindowText(wHandle, Title, 255);
GetClassName(wHandle, ClassName, 255);
if IsWindowVisible(wHandle) then
lb.Items.Add(string(Title) + '-' + string(ClassName));
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
ListBox1.Items.Clear;
EnumWindows(@EnumWindowsProc, ListBox1);
end;

end.

最佳答案

首先声明是错误的。它需要是 stdcall,并且返回 BOOL

function EnumWindowsProc(wHandle: HWND; lb: TListBox): BOOL; stdcall;

其次,您的实现没有设置返回值。返回 True 继续枚举,返回 False 停止枚举。在您的情况下,您需要返回 True

最后,当您调用 EnumWindows 时,您需要将列表框转换为 LPARAM

EnumWindows(@EnumWindowsProc , LPARAM(ListBox1));

咨询documentation了解完整详细信息。

把它们放在一起,你会得到这个:

function EnumWindowsProc(wHandle: HWND; lb: TListBox): BOOL; stdcall;
var
Title, ClassName: array[0..255] of char;
begin
GetWindowText(wHandle, Title, 255);
GetClassName(wHandle, ClassName, 255);
if IsWindowVisible(wHandle) then
lb.Items.Add(string(Title) + '-' + string(ClassName));
Result := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
ListBox1.Items.Clear;
EnumWindows(@EnumWindowsProc, LPARAM(ListBox1));
end;

另请注意,EnumWindows 不会枚举所有正在运行的进程。它的作用是枚举所有顶级窗口。请注意完全相同的事情。要枚举所有正在运行的进程,可以使用 EnumProcesses。但是,由于您正在读出窗口标题和窗口类名称,因此您可能确实希望使用 EnumWindows

<小时/>

正如我之前多次说过的,我讨厌 EnumWindows 的 Delphi header 翻译使用 Pointer 作为 EnumWindowsProc 参数。这意味着您不能依赖编译器来检查类型安全。我个人总是使用我自己的 EnumWindows 版本。

type
TFNWndEnumProc = function(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;

function EnumWindows(lpEnumFunc: TFNWndEnumProc; lParam: LPARAM): BOOL;
stdcall; external user32;

然后,当您调用该函数时,您不使用 @ 运算符,因此让编译器检查您的回调函数是否已正确声明:

EnumWindows(EnumWindowsProc, ...);

关于delphi - 如何调用 EnumWindowsProc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13786563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com