コードには 3 つの問題があります。まず、メモリを割り当てた場合 ( GetMem
)、解放する必要があります ( FreeMem
):
GetMem(p, 1024);
try
// Do sth with the memory
finally
FreeMem(p);
end;
第二100
に、との関係がわかりません800
。実際、あなたは嘘をついています。100 バイトのバッファーを割り当て、800 の Unicode 文字を保持するのに十分な大きさであることを Windows に伝えます。
3 番目に、比較が true でない限り、関数の戻り値は未定義です。したがって、手順の先頭に追加するか、result := false
最後の 2 行 ( の前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;
更新:抽象化レベルに関する David の優れた点によると、次のようにするとよいでしょう。
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;