You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 06:35:29