您的代码中存在三个问题。首先,如果分配内存(GetMem
),则需要释放它(FreeMem
):
GetMem(p, 1024);
try
// Do sth with the memory
finally
FreeMem(p);
end;
其次100
,我看不到和之间的关系800
。事实上,你在撒谎。您分配一个 100 字节的缓冲区,然后告诉 Windows 它足够大,可以容纳 800 个 Unicode 字符。
第三,函数的返回值是未定义的,除非比较为真。因此,您需要添加result := false
到程序的开头,或者将最后两行(之前end;
)替换为
result := string(FromClass) = 'SDIMainFrame'
无论如何,最好不要使用GetMem
。我会这样做:
var
CN: array[0..256] of char;
begin
GetClassName(MFhandle, CN, 256)
此外,您应该检查错误。如果GetClassName
返回0
,则发生错误。因此,你可以做类似的事情
function Active_window_mf(): boolean;
var
CN: array[0..256] of char;
begin
result := false;
if GetClassName(GetForegroundWindow, CN, 257) > 0 then
result := string(CN) = 'SDIMainFrame';
end;
更新:根据大卫关于抽象级别的优秀观点,这样做会很好:
function ClassNameFromHWND(const Handle: HWND): string;
var
CN: array[0..256] of char;
begin
result := '';
if GetClassName(Handle, CN, 257) > 0 then
result := CN;
end;
function Active_window_mf(): boolean;
begin
result := ClassNameFromHWND(GetForegroundWindow) = 'SDIMainForm';
end;