【发布时间】:2020-04-13 11:44:06
【问题描述】:
如果我没记错的话,flutter 目前是通过 windows 的 win32 库实现的(尽管一些文档页面指出这可能会更改为 .NET 或其他一些框架,因为 Flutter windows 处于非常早期的开发阶段并且可能随时更改而不保持向后兼容性)。有没有办法获取当前flutter应用的win32窗口句柄?
【问题讨论】:
如果我没记错的话,flutter 目前是通过 windows 的 win32 库实现的(尽管一些文档页面指出这可能会更改为 .NET 或其他一些框架,因为 Flutter windows 处于非常早期的开发阶段并且可能随时更改而不保持向后兼容性)。有没有办法获取当前flutter应用的win32窗口句柄?
【问题讨论】:
是的:
在当前框架 API 中,您可以使用 GetNativeWindow() 从框架中获取 Flutter 视图(不是顶级窗口)的句柄。如果您想要顶级窗口,您可以使用标准 Win32 API 从那里向上走。
假设您使用的是 FDE Windows 运行器,您还可以使用 GetHandle() 直接在 main.cpp 中获取顶级窗口。
【讨论】:
static final _user32 = DynamicLibrary.open('user32.dll');
static final findWindowA = _user32.lookupFunction<
Int32 Function(Pointer<Utf8> _lpClassName, Pointer<Utf8> _lpWindowName),
int Function(Pointer<Utf8> _lpClassName,
Pointer<Utf8> _lpWindowName)>('FindWindowA');
int hWnd = findWindowA('FLUTTER_RUNNER_WIN32_WINDOW'.toNativeUtf8(), nullptr);
print(hWnd);
'FLUTTER_RUNNER_WIN32_WINDOW'是在windows/runner/win32_window.cpp中定义的flutter的窗口类名,你可以让它唯一,以防用户运行多个flutter应用程序。
toNativeUtf8 是 dart ffi 中的一个函数。
【讨论】: