Kotlin Multiplatform Compose Win10应用位置偏移问题求助
Windows 10平板模式下Compose自助终端应用全屏保持方案
1. 禁用系统边缘手势干扰
Windows平板的边缘滑动是系统级行为,要阻止它打乱应用全屏,得通过Windows原生API禁用相关手势。可以用JNA在KMP项目里调用User32.dll:
- 先加JNA依赖到你的build.gradle.kts(windows目标下):
implementation("net.java.dev.jna:jna:5.13.0") implementation("net.java.dev.jna:jna-platform:5.13.0")
- 然后写个函数禁用手势,在应用启动时调用:
import com.sun.jna.platform.win32.User32 import com.sun.jna.platform.win32.WinUser fun disableTabletEdgeGestures(hwnd: Long) { val user32 = User32.INSTANCE // 拦截左上/右上滑动的手势 val gestureConfig = WinUser.GESTURECONFIG().apply { dwID = WinUser.GID_PAN // 针对滑动手势 dwWant = 0 dwBlock = WinUser.GC_ALLGESTURES } user32.SetGestureConfig(hwnd, WinUser.GC_ALLGESTURES, 1, arrayOf(gestureConfig), gestureConfig.size()) }
- 在Compose的Window里获取窗口句柄并调用:
fun main() = application { val windowState = rememberWindowState(placement = WindowPlacement.Maximized) Window( onCloseRequest = { /* 清理逻辑 */ }, title = "App", state = windowState, alwaysOnTop = true, undecorated = true ) { windowState.window?.hwnd?.let { hwnd -> LaunchedEffect(hwnd) { disableTabletEdgeGestures(hwnd) } } // 你的UI内容 } }
2. 实时锁定窗口最大化状态
做个兜底,监听窗口状态,一旦它偏离最大化,立刻强制拉回去:
fun main() = application { val windowState = rememberWindowState(placement = WindowPlacement.Maximized) LaunchedEffect(Unit) { snapshotFlow { windowState.placement } .filter { it != WindowPlacement.Maximized } .collect { windowState.placement = WindowPlacement.Maximized } } Window( onCloseRequest = { /* 清理逻辑 */ }, title = "App", state = windowState, alwaysOnTop = true, undecorated = true ) { // 你的UI内容 } }
3. 用Windows系统级Kiosk模式(最彻底)
既然是自助终端,直接用Windows自带的分配访问权限(Kiosk模式),把你的应用设为唯一允许运行的程序:
- 打开Windows设置 → 账户 → 其他用户 → 设置分配的访问权限
- 选「Kiosk」,创建专用账户,指定你的应用路径
- 启动后应用会独占全屏,系统手势、任务栏这些全被禁用,完全不会有干扰
4. 强制窗口覆盖整个屏幕
原来的Maximized可能没完全覆盖所有系统区域,用API强制窗口铺满整个显示器:
import com.sun.jna.platform.win32.User32 import com.sun.jna.platform.win32.WinUser fun forceFullScreen(hwnd: Long) { val user32 = User32.INSTANCE val desktopRect = WinUser.RECT() user32.GetWindowRect(user32.GetDesktopWindow(), desktopRect) // 强制窗口位置和大小覆盖整个桌面 user32.SetWindowPos( hwnd, WinUser.HWND_TOPMOST, desktopRect.left, desktopRect.top, desktopRect.right - desktopRect.left, desktopRect.bottom - desktopRect.top, WinUser.SWP_SHOWWINDOW or WinUser.SWP_NOOWNERZORDER ) }
在窗口初始化后调用这个函数,确保没有任何空隙留给系统手势触发。
内容的提问来源于stack exchange,提问作者Jesser
相关产品推荐
相关产品推荐

