feat: 增加基础的游戏进程监听

This commit is contained in:
xkeyC
2025-11-20 00:27:20 +08:00
parent f6340337db
commit b65187d4f0
19 changed files with 1873 additions and 702 deletions

View File

@@ -6,6 +6,9 @@
import '../frb_generated.dart';
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
// These functions are ignored because they are not marked as `pub`: `get_process_path`
// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `fmt`
Future<void> sendNotify({
String? summary,
String? body,
@@ -22,3 +25,37 @@ Future<bool> setForegroundWindow({required String windowName}) => RustLib
.instance
.api
.crateApiWin32ApiSetForegroundWindow(windowName: windowName);
Future<int> getProcessPidByName({required String processName}) => RustLib
.instance
.api
.crateApiWin32ApiGetProcessPidByName(processName: processName);
Future<List<ProcessInfo>> getProcessListByName({required String processName}) =>
RustLib.instance.api.crateApiWin32ApiGetProcessListByName(
processName: processName,
);
class ProcessInfo {
final int pid;
final String name;
final String path;
const ProcessInfo({
required this.pid,
required this.name,
required this.path,
});
@override
int get hashCode => pid.hashCode ^ name.hashCode ^ path.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is ProcessInfo &&
runtimeType == other.runtimeType &&
pid == other.pid &&
name == other.name &&
path == other.path;
}

View File

@@ -69,7 +69,7 @@ class RustLib extends BaseEntrypoint<RustLibApi, RustLibApiImpl, RustLibWire> {
String get codegenVersion => '2.11.1';
@override
int get rustContentHash => -706588047;
int get rustContentHash => 1227557070;
static const kDefaultExternalLibraryLoaderConfig =
ExternalLibraryLoaderConfig(
@@ -95,6 +95,14 @@ abstract class RustLibApi extends BaseApi {
bool? withCustomDns,
});
Future<List<ProcessInfo>> crateApiWin32ApiGetProcessListByName({
required String processName,
});
Future<int> crateApiWin32ApiGetProcessPidByName({
required String processName,
});
Future<RsiLauncherAsarData> crateApiAsarApiGetRsiLauncherAsarData({
required String asarPath,
});
@@ -280,6 +288,66 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
],
);
@override
Future<List<ProcessInfo>> crateApiWin32ApiGetProcessListByName({
required String processName,
}) {
return handler.executeNormal(
NormalTask(
callFfi: (port_) {
var arg0 = cst_encode_String(processName);
return wire.wire__crate__api__win32_api__get_process_list_by_name(
port_,
arg0,
);
},
codec: DcoCodec(
decodeSuccessData: dco_decode_list_process_info,
decodeErrorData: dco_decode_AnyhowException,
),
constMeta: kCrateApiWin32ApiGetProcessListByNameConstMeta,
argValues: [processName],
apiImpl: this,
),
);
}
TaskConstMeta get kCrateApiWin32ApiGetProcessListByNameConstMeta =>
const TaskConstMeta(
debugName: "get_process_list_by_name",
argNames: ["processName"],
);
@override
Future<int> crateApiWin32ApiGetProcessPidByName({
required String processName,
}) {
return handler.executeNormal(
NormalTask(
callFfi: (port_) {
var arg0 = cst_encode_String(processName);
return wire.wire__crate__api__win32_api__get_process_pid_by_name(
port_,
arg0,
);
},
codec: DcoCodec(
decodeSuccessData: dco_decode_i_32,
decodeErrorData: dco_decode_AnyhowException,
),
constMeta: kCrateApiWin32ApiGetProcessPidByNameConstMeta,
argValues: [processName],
apiImpl: this,
),
);
}
TaskConstMeta get kCrateApiWin32ApiGetProcessPidByNameConstMeta =>
const TaskConstMeta(
debugName: "get_process_pid_by_name",
argNames: ["processName"],
);
@override
Future<RsiLauncherAsarData> crateApiAsarApiGetRsiLauncherAsarData({
required String asarPath,
@@ -722,6 +790,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return raw as Uint8List;
}
@protected
List<ProcessInfo> dco_decode_list_process_info(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return (raw as List<dynamic>).map(dco_decode_process_info).toList();
}
@protected
List<(String, String)> dco_decode_list_record_string_string(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
@@ -770,6 +844,19 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return raw == null ? null : dco_decode_list_prim_u_8_strict(raw);
}
@protected
ProcessInfo dco_decode_process_info(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
final arr = raw as List<dynamic>;
if (arr.length != 3)
throw Exception('unexpected arr length: expect 3 but see ${arr.length}');
return ProcessInfo(
pid: dco_decode_u_32(arr[0]),
name: dco_decode_String(arr[1]),
path: dco_decode_String(arr[2]),
);
}
@protected
(String, String) dco_decode_record_string_string(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
@@ -949,6 +1036,18 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return deserializer.buffer.getUint8List(len_);
}
@protected
List<ProcessInfo> sse_decode_list_process_info(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
var len_ = sse_decode_i_32(deserializer);
var ans_ = <ProcessInfo>[];
for (var idx_ = 0; idx_ < len_; ++idx_) {
ans_.add(sse_decode_process_info(deserializer));
}
return ans_;
}
@protected
List<(String, String)> sse_decode_list_record_string_string(
SseDeserializer deserializer,
@@ -1034,6 +1133,15 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
}
}
@protected
ProcessInfo sse_decode_process_info(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
var var_pid = sse_decode_u_32(deserializer);
var var_name = sse_decode_String(deserializer);
var var_path = sse_decode_String(deserializer);
return ProcessInfo(pid: var_pid, name: var_name, path: var_path);
}
@protected
(String, String) sse_decode_record_string_string(
SseDeserializer deserializer,
@@ -1295,6 +1403,18 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
serializer.buffer.putUint8List(self);
}
@protected
void sse_encode_list_process_info(
List<ProcessInfo> self,
SseSerializer serializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_i_32(self.length, serializer);
for (final item in self) {
sse_encode_process_info(item, serializer);
}
}
@protected
void sse_encode_list_record_string_string(
List<(String, String)> self,
@@ -1378,6 +1498,14 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
}
}
@protected
void sse_encode_process_info(ProcessInfo self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_u_32(self.pid, serializer);
sse_encode_String(self.name, serializer);
sse_encode_String(self.path, serializer);
}
@protected
void sse_encode_record_string_string(
(String, String) self,

View File

@@ -62,6 +62,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected
Uint8List dco_decode_list_prim_u_8_strict(dynamic raw);
@protected
List<ProcessInfo> dco_decode_list_process_info(dynamic raw);
@protected
List<(String, String)> dco_decode_list_record_string_string(dynamic raw);
@@ -86,6 +89,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected
Uint8List? dco_decode_opt_list_prim_u_8_strict(dynamic raw);
@protected
ProcessInfo dco_decode_process_info(dynamic raw);
@protected
(String, String) dco_decode_record_string_string(dynamic raw);
@@ -159,6 +165,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected
Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer);
@protected
List<ProcessInfo> sse_decode_list_process_info(SseDeserializer deserializer);
@protected
List<(String, String)> sse_decode_list_record_string_string(
SseDeserializer deserializer,
@@ -187,6 +196,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected
Uint8List? sse_decode_opt_list_prim_u_8_strict(SseDeserializer deserializer);
@protected
ProcessInfo sse_decode_process_info(SseDeserializer deserializer);
@protected
(String, String) sse_decode_record_string_string(
SseDeserializer deserializer,
@@ -315,6 +327,18 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
return ans;
}
@protected
ffi.Pointer<wire_cst_list_process_info> cst_encode_list_process_info(
List<ProcessInfo> raw,
) {
// Codec=Cst (C-struct based), see doc to use other codecs
final ans = wire.cst_new_list_process_info(raw.length);
for (var i = 0; i < raw.length; ++i) {
cst_api_fill_to_wire_process_info(raw[i], ans.ref.ptr[i]);
}
return ans;
}
@protected
ffi.Pointer<wire_cst_list_record_string_string>
cst_encode_list_record_string_string(List<(String, String)> raw) {
@@ -374,6 +398,16 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
cst_api_fill_to_wire_rsi_launcher_asar_data(apiObj, wireObj.ref);
}
@protected
void cst_api_fill_to_wire_process_info(
ProcessInfo apiObj,
wire_cst_process_info wireObj,
) {
wireObj.pid = cst_encode_u_32(apiObj.pid);
wireObj.name = cst_encode_String(apiObj.name);
wireObj.path = cst_encode_String(apiObj.path);
}
@protected
void cst_api_fill_to_wire_record_string_string(
(String, String) apiObj,
@@ -499,6 +533,12 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
SseSerializer serializer,
);
@protected
void sse_encode_list_process_info(
List<ProcessInfo> self,
SseSerializer serializer,
);
@protected
void sse_encode_list_record_string_string(
List<(String, String)> self,
@@ -532,6 +572,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
SseSerializer serializer,
);
@protected
void sse_encode_process_info(ProcessInfo self, SseSerializer serializer);
@protected
void sse_encode_record_string_string(
(String, String) self,
@@ -719,6 +762,60 @@ class RustLibWire implements BaseWire {
)
>();
void wire__crate__api__win32_api__get_process_list_by_name(
int port_,
ffi.Pointer<wire_cst_list_prim_u_8_strict> process_name,
) {
return _wire__crate__api__win32_api__get_process_list_by_name(
port_,
process_name,
);
}
late final _wire__crate__api__win32_api__get_process_list_by_namePtr =
_lookup<
ffi.NativeFunction<
ffi.Void Function(
ffi.Int64,
ffi.Pointer<wire_cst_list_prim_u_8_strict>,
)
>
>(
'frbgen_starcitizen_doctor_wire__crate__api__win32_api__get_process_list_by_name',
);
late final _wire__crate__api__win32_api__get_process_list_by_name =
_wire__crate__api__win32_api__get_process_list_by_namePtr
.asFunction<
void Function(int, ffi.Pointer<wire_cst_list_prim_u_8_strict>)
>();
void wire__crate__api__win32_api__get_process_pid_by_name(
int port_,
ffi.Pointer<wire_cst_list_prim_u_8_strict> process_name,
) {
return _wire__crate__api__win32_api__get_process_pid_by_name(
port_,
process_name,
);
}
late final _wire__crate__api__win32_api__get_process_pid_by_namePtr =
_lookup<
ffi.NativeFunction<
ffi.Void Function(
ffi.Int64,
ffi.Pointer<wire_cst_list_prim_u_8_strict>,
)
>
>(
'frbgen_starcitizen_doctor_wire__crate__api__win32_api__get_process_pid_by_name',
);
late final _wire__crate__api__win32_api__get_process_pid_by_name =
_wire__crate__api__win32_api__get_process_pid_by_namePtr
.asFunction<
void Function(int, ffi.Pointer<wire_cst_list_prim_u_8_strict>)
>();
void wire__crate__api__asar_api__get_rsi_launcher_asar_data(
int port_,
ffi.Pointer<wire_cst_list_prim_u_8_strict> asar_path,
@@ -1144,6 +1241,19 @@ class RustLibWire implements BaseWire {
late final _cst_new_list_prim_u_8_strict = _cst_new_list_prim_u_8_strictPtr
.asFunction<ffi.Pointer<wire_cst_list_prim_u_8_strict> Function(int)>();
ffi.Pointer<wire_cst_list_process_info> cst_new_list_process_info(int len) {
return _cst_new_list_process_info(len);
}
late final _cst_new_list_process_infoPtr =
_lookup<
ffi.NativeFunction<
ffi.Pointer<wire_cst_list_process_info> Function(ffi.Int32)
>
>('frbgen_starcitizen_doctor_cst_new_list_process_info');
late final _cst_new_list_process_info = _cst_new_list_process_infoPtr
.asFunction<ffi.Pointer<wire_cst_list_process_info> Function(int)>();
ffi.Pointer<wire_cst_list_record_string_string>
cst_new_list_record_string_string(int len) {
return _cst_new_list_record_string_string(len);
@@ -1224,6 +1334,22 @@ final class wire_cst_list_String extends ffi.Struct {
external int len;
}
final class wire_cst_process_info extends ffi.Struct {
@ffi.Uint32()
external int pid;
external ffi.Pointer<wire_cst_list_prim_u_8_strict> name;
external ffi.Pointer<wire_cst_list_prim_u_8_strict> path;
}
final class wire_cst_list_process_info extends ffi.Struct {
external ffi.Pointer<wire_cst_process_info> ptr;
@ffi.Int32()
external int len;
}
final class wire_cst_rs_process_stream_data extends ffi.Struct {
@ffi.Int32()
external int data_type;