0

私はアクティブなウィンドウをキャプチャするデルファイでプログラムをやっています問題は、コードが私が望むことをしないということです.私が望むのは、アクティブなウィンドウの名前を付けて表示する代わりに別の名前の名前が表示されるまで永遠に待ってください。問題がなければ、私は検証をうまく行います。

コード

procedure TForm1.Timer4Timer(Sender: TObject);

var
  ventana1: array [0 .. 255] of char;       
  nombre1: string;
  nombre2: String;

begin

  GetWindowText(GetForegroundWindow, ventana1, SizeOf(ventana1));

  nombre1 := ventana1;

  if not(nombre1 = nombre2) then
  begin
    nombre2 := nombre1;
    Memo1.Lines.Add(nombre2);
  end;

end;
4

1 に答える 1

3

nombre2初期化するために何もしないので、nombre1 = nombre2真になることはありません。nombre2は常にnil

nombre2 := nombre1;プロシージャが終了するとすぐに値が失われるため、ステートメントでの設定ifも意味がありません。タイマーイベントの次の呼び出しは、プロシージャが開始されるたびに初期化され、プロシージャが終了するたびに解放される新しいローカル変数であるnombre2 = nilため、最初からやり直されます。nombre2nil

nombre2代わりにフォーム インスタンス変数に移動します。

type
  TForm1 = class(TForm)
    // normal declarations here
    procedure Timer4Timer(Sender: TObject);
  private
    Nombre2: string;  // I'd use LastWindowName myself. :-)
  ...
  end;

さて、あなたのタイマーイベントで:

procedure TForm1.Timer4Timer(Sender: TObject);
var
  ventana1: array [0 .. 255] of char;       
  nombre1: string;  // I'd use 'NewName' 
begin
  GetWindowText(GetForegroundWindow, ventana1, SizeOf(ventana1));

  nombre1 := ventana1;

  if not(nombre1 = nombre2) then  // Now nombre2 still has the last value,
  begin                           // because it's no longer a local variable
    nombre2 := nombre1;           // Store new "last window name"
    Memo1.Lines.Add(nombre2);
  end;
end
于 2013-09-08T00:42:35.577 に答える