16,748
社区成员
发帖
与我相关
我的任务
分享
WNDENUMPROC R_EnumProc = NULL;
BOOL WINAPI MyEnumFunc(HWND hWnd, LPARAM lParam)
{
return R_EnumProc(hWnd, lParam);
}
BOOL WINAPI MyEnumWindows(WNDENUMPROC tsEnumFunc, LPARAM lParam)
{...}
function MyEnumFunc(hWnd: LongWord; lParam: LPARAM): BOOL; stdcall;
var
func: FNWndEnumProc;
begin
@func := R_EnumProc; //如果MyEnumFunc里只有这一句代码,程序会占用CPU100%,自身卡死
result := func(hWnd,lParam); //执行到这里会提示:stack overflow。程序退出
end;
function NewEnumWindows(lpEnumFunc: TFNWndEnumProc; lParam: LongWord): BOOL; stdcall; //Hook EnumWindows
var
Retu:Boolean;
begin
R_EnumProcc := lpEnumFunc;
//Retut := EnumWindows((TFNWndEnumProc)MyEnumFun, lParam); //原VC版本的
Retu := EnumWindows(@MyEnumFun, lParam);
result := Retu;
end;
function EnumWindowsProc(hwnd: HWND;lParam: DWORD): boolean; stdcall;
var
szCaption: array[0..256] of Char;
begin
GetWindowText(hwnd,szCaption,127);
if length(szCaption)>0 then
begin
showmessage(szCaption); //这里是窗体名枚举 想判断某个窗体在这里写就成
end;
result:= TRUE;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
EnumWindows(@EnumWindowsProc, 0);
end;
type
FNWndEnumProc = function(hWnd: LongWord; lParam: LPARAM): BOOL; stdcall;
var
R_EnumProc: TFNWndEnumProc = nil;
function MyEnumFunc(hWnd: LongWord; lParam: LPARAM): BOOL; stdcall;
var
func: FNWndEnumProc;
begin
@func := R_EnumProc;
result := func(hWnd,lParam);
end;
WNDENUMPROC R_EnumProc = NULL;
BOOL WINAPI MyEnumFunc(HWND hWnd, LPARAM lParam)
{
return R_EnumProc(hWnd, lParam);
}
R_EnumProc : TFNWndEnumProc = nil; //声明为全局变量,这写代码是写在一个无窗口的DLL内
function MyEnumFunc(hWnd: LongWord; lParam: LPARAM): BOOL; stdcall;
begin
result :=R_EnumProcc(hWnd,lParam); //编译器在这里提示:[错误] : Missing operator or semicolon
end;