我使用以下代码来查看我的前台窗口是否为SDImainframe。
Function Active_window_mf() :Boolean;
var
FromClass: PChar;
begin
MFhandle := GetForeGroundWindow;
GetMem(FromClass, 100);
GetClassName(MFhandle, PChar(FromClass), 800);
if StrPas(FromClass) = 'SDIMainFrame' then
result := true;
end;然而,MADExcept报告Getmem函数有问题。有没有人会说,我的代码出了什么问题?
发布于 2013-03-12 00:04:45
您的代码中有三个问题。对于第一个,如果您分配内存(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;https://stackoverflow.com/questions/15343154
复制相似问题