0

ネイティブの sample_extension サンプル内に、現在アクティブなウィンドウのタイトルを取得する関数を追加しました。ダーツ内で定期的に getActivetWindowTitle を呼び出して出力したい

import "sample_extension.dart";
import "dart:async";

void main() {
  var isLittleEndian = SysInfo.isLittleEndian;
  var pageSize = SysInfo.pageSize;
  var sizeOfInt = SysInfo.sizeOfInt;
  var version = SysInfo.version;

  print('Dart VM (${sizeOfInt * 8} bit): $version');
  print('Page size: $pageSize KB');
  print('Endianness: ${isLittleEndian ? 'Little-endian' : 'Big-endian'}');


  new Timer.periodic(new Duration(seconds:1), (timer) => pr() );

}

void pr(){
  var activeWindow = SysInfo.activeWindow;
  print('Active window: $activeWindow');
}

私のダーツファイル sample_extension.dart は

library sample_extension;

import "dart-ext:sample_extension";

class SysInfo {
  //<se>
  static bool isLittleEndian = _isLittleEndian();
  static final int pageSize = _getPageSize();
  static final int sizeOfInt = _getSizeOfInt();
  static final String version = _getVersionString();

  static bool _isLittleEndian() native "IsLittleEndian";
  static int _getPageSize() native "GetPageSize";
  static int _getSizeOfInt() native "GetSizeOfInt";
  static String _getVersionString() native "GetVersionString";
  //</se>
  //<aui>
  static final String activeWindow = _getActiveWindowString();
  static String _getActiveWindowString() native "GetActiveWindowString";
  //</aui>
}

追加cc部分は

void GetActiveWindowString(Dart_NativeArguments arguments) {
  Dart_Handle result;
  HWND hwnd;
  LPTSTR lpString;

  Dart_EnterScope();
  hwnd=GetForegroundWindow(); 
  GetWindowText(hwnd, lpString, 128);
  result = Dart_NewStringFromCString(lpString);

  Dart_SetReturnValue(arguments, result);
  Dart_ExitScope();
}

関数検索関数リストを追加しました

 {"GetActiveWindowString", GetActiveWindowString},

dartapp をロードすると、正しいアクティブ ウィンドウが表示されます。

ただし、実行中、プログラムは開始時に初期化された値のみを出力します。実際のアクティブ ウィンドウではありません。

私は何を間違っていますか?

4

1 に答える 1

4

あなたactiveWindowは次のようにマークされていfinalます:これは、初期化後に変更されず、その時点での値でA final variable can be set only once;最初に初期化されることを意味します。getActiveWindowString()

これを試して:

static String get activeWindow => _getActiveWindowString();

activeWindow呼び出し時にアクティブなウィンドウを返すプロパティになりました。

編集:

実装にバグがあり_getActiveWindowStringます:

LPTSTR lpString; // lpString is not initialized and points to random location
...
GetWindowText(hwnd, lpString, 128); // overrides the random location

そのはず:

TCHAR lpString[128];
于 2013-05-22T09:59:27.280 に答える