{"url":"https://levimc.org/mods/github.com/LiteLDev/BeDD/","tooth":"github.com/LiteLDev/BeDD","name":"Be.D.D.","description":"Drive a Minecraft Bedrock Edition client from test scripts without touching the real mouse, keyboard or foreground window","owner":"LiteLDev","icon":"https://raw.githubusercontent.com/LiteLDev/BeDD/main/docs/logo.png","repository":"https://github.com/LiteLDev/BeDD","issues":"https://github.com/LiteLDev/BeDD/issues","releases":"https://github.com/LiteLDev/BeDD/releases","stars":1,"updated":"2026-10-30T00:22:13Z","published":"2026-10-22T15:36:10Z","created":"2026-10-22T14:45:12Z","license":"LGPL-3.0","categories":["developer"],"platforms":["levilamina"],"env":["client"],"gameVersions":["1.26.51"],"tags":["platform:levilamina","type:mod","client","testing","category:developer","automation","input"],"latest":{"variant":"client","version":"0.3.1","install":"lip install github.com/LiteLDev/BeDD#client@0.3.1"},"readmes":[{"file":"README.md","lang":"en","text":"# Be.D.D.\n\n<img src=\"docs/logo.png\" alt=\"\" width=\"128\" align=\"right\">\n\nEnglish | [简体中文](README.zh-CN.md)\n\n[![Release](https://img.shields.io/github/v/release/LiteLDev/BeDD)](https://github.com/LiteLDev/BeDD/releases)\n[![License](https://img.shields.io/github/license/LiteLDev/BeDD)](COPYING.LESSER)\n\nBe.D.D. (Bedrock Deep Dive) is named after the H.D.D. of Zenless Zone Zero: a Proxy guides agents through the\nHollows from afar, your script guides Minecraft from the background.\n\nRun end-to-end tests of your [LeviLamina](https://github.com/LiteLDev/LeviLamina) client mods\n**in the background**. Your script presses keys, types and clicks inside Minecraft Bedrock, while\nyour own mouse, keyboard and windows stay yours, and several games can play at once.\n\n<p align=\"center\"><img src=\"docs/showcase/desktop.webp\" alt=\"Three Minecraft windows react to a test script while the terminal in front keeps the focus\" width=\"100%\"></p>\n\n> [!WARNING]\n> This is a **testing tool**. While background mode is on, the game ignores your real mouse and\n> keyboard. Do not leave it in a game you play (**Ctrl+Shift+F12** in the game window turns\n> background mode off).\n\n## Features\n\n- **Keep using your PC.** The game never takes the foreground, the cursor or your keystrokes, and\n  your clicks never land in it.\n- **Several games at once.** Each game instance has its own pipe; a cheap clone of an instance\n  takes a few seconds.\n- **One window for all of them.** The games of every test run on the PC show up live in one\n  manager window instead of popping up on your desktop; closing it closes them all.\n- **Plays like a player.** Keys, chat, key bindings, menus, hover tooltips, clicks and the camera\n  all work as with a real mouse and keyboard.\n- **Deterministic.** Every call returns once the game has handled the input, so no guessing sleeps.\n- **Screenshots of covered windows.** The game can sit behind your other windows.\n- **Drop-in for existing harnesses.** One file replaces the usual `Click`, `Press-Key`, `Focus-Game`\n  helpers of LeviLauncher harnesses; scenarios stay as they are.\n\n<p align=\"center\"><img src=\"docs/showcase/how-it-feels.svg\" alt=\"Your input goes to your apps; the script drives three background games over one pipe each\" width=\"100%\"></p>\n\n## Install\n\nPut it into the game instance your tests run, for example with\n[lip](https://github.com/LiteLDev/lip):\n\n```powershell\nlip install github.com/LiteLDev/BeDD#client\n```\n\nor unzip `bedd-client-windows-x64.zip` from the\n[releases](https://github.com/LiteLDev/BeDD/releases) into the instance's `mods\\`\nfolder. Most harnesses copy it in at the start of a run and remove it afterwards\n([see below](#plug-it-into-a-harness)).\n\nNeeds Minecraft Bedrock Edition **1.26.51** (GDK) with LeviLamina **26.51.x** (client), in a game\ninstance installed with LeviLauncher. Tests start that instance with `Start-BeDDGame.ps1`\nrather than through the launcher ([see below](#several-games-at-once)). Only the test PC's game\nneeds it; servers and players do not.\n\n## How to use\n\nThe PowerShell module ships next to the mod:\n\n```powershell\nImport-Module .\\mods\\BeDD\\BeDD.psm1\nConnect-BeDD                          # waits until the game is up\nSend-BeDDKey E                             # open the inventory\nSend-BeDDMouse click -RX 0.5 -RY 0.474     # click at a fraction of the window\nSend-BeDDKey T; Send-BeDDText '/give @s apple 3'; Send-BeDDKey ENTER\nSave-BeDDScreenshot C:\\temp\\shot.png       # works while the window is covered\n```\n\n| Command | What it does |\n|---|---|\n| `Connect-BeDD [-PipeName p]` | wait for the game and pick which game the next calls go to |\n| `Send-BeDDKey E` | press a key; `-Action down`/`up` to hold, `-Vk 0x10` for any virtual key |\n| `Send-BeDDText '...'` | type text (no key presses, so `t` does not open chat); `-DelayMs` per character |\n| `Send-BeDDMouse click -RX 0.5 -RY 0.5` | `move`, `down`, `up`, `click`, `wheel` at `-X -Y` pixels or `-RX -RY` fractions; `-Button right` |\n| `Send-BeDDRaw move -Dx 200` | turn the camera in the world; `click -Button right` to use an item |\n| `Clear-BeDDInput` | release every key and button still held |\n| `Save-BeDDScreenshot path.png` / `Get-BeDDBitmap` | the game's picture, even when covered |\n| `Set-BeDDWindow 1600 900` | resize the game window without bringing it forward |\n| `Set-BeDDBackground $false` | hand the game back to your real mouse and keyboard |\n| `Get-BeDDState` | is the game up, how much input arrived, did it ever get the foreground |\n\nKey names: letters, digits, `ESC`, `ENTER`, `BACK`, `TAB`, `SPACE`, `SHIFT`, `CTRL`, `ALT`, arrows\n(`LEFT`...), `HOME`, `END`, `PGUP`, `PGDN`, `INSERT`, `DELETE`, `F1`..`F24`, `SLASH`, `GRAVE`,\n`MINUS`, `EQUALS`.\n\n### Several games at once\n\n```powershell\npwsh -NoProfile -File clone-instance.ps1 -Slot 2                  # versions\\1.26.51.01-hi2, ~90 MB, seconds\n& .\\Start-BeDDGame.ps1 -Instance 1.26.51.01-hi2                # starts it without bringing it forward\nConnect-BeDD -PipeName BeDD-1.26.51.01-hi2   # the pipeName in that instance's config\n```\n\nA clone has its own `mods\\`, logs, worlds and options. A few rules keep parallel runs from\ntripping over each other:\n\n- Give every instance its own lock file, and find your game by its **instance folder**, never just\n  by the name `Minecraft.Windows` (or you close someone else's game).\n- Start games as `Minecraft.Windows.exe` (`Start-BeDDGame.ps1` does): under another file name\n  the game uses your normal Minecraft profile instead of the instance's.\n- Make test worlds single-player with `Set-WorldSinglePlayer <worldDir>` (from the harness shim):\n  games on one PC share an online sign-in, and multiplayer worlds opened at the same time fail with\n  \"An error has occurred\" (code \"Blaze\").\n- A run that joins a server online sets `$script:ExclusiveSignaling = $true` before `Start-Game`\n  and gets the PC to itself while the other games close.\n\n### The manager window\n\nThe first `Start-BeDDGame.ps1` of your logon session opens the **manager window**, and every\nlater run (from any terminal, harness or agent) reuses it. Each headless game then shows up there as\na live picture instead of as a window of its own: no taskbar buttons, nothing in Alt+Tab, no windows\npopping up and vanishing while several runs start and close games. It never takes the focus.\n\n- Each game is labelled with the project (and worktree) of the script that started it, its\n  instance and pid, and whether input is arriving. `-Label` on `Start-BeDDGame.ps1` names it.\n- **Closing the manager window closes every game in it** (it asks first). The games also go if the\n  manager is killed, so nothing is left running in the background.\n- Double-click a game to show only that one. Right-click it to take it over with your own mouse and\n  keyboard (and hand it back to the script), open its `latest.log` or instance folder, or close it.\n- From a script: `BeDDManager.ps1 -List` lists the games, `-Game <pid> -Action show|hide|close`\n  does what the right-click menu does, `-Shutdown` closes the manager and every game without asking.\n\nIt needs PowerShell 7 (`pwsh`). `Start-BeDDGame.ps1 -NoManager` (or `BEDD_MANAGER=0`)\nstarts a game without starting the manager, and `Install-BeDDMod -NoManager` (config\n`\"manager\": false`) keeps a game out of a running one, for example to record the real screen.\n\n### Plug it into a harness\n\n`harness-shim.ps1` replaces the usual helpers of LeviLauncher harnesses (`Focus-Game`,\n`Assert-GameForeground`, `Set-GameWindowSize`, `Move-Mouse`, `Click`, `Scroll`, `Press-Key`,\n`Type-Text`, `Get-ClientBitmap`, same parameters) and wraps `Start-Game`/`Stop-Game`:\n\n```powershell\n. \"$PSScriptRoot/lib.ps1\"\nif (-not $Foreground) {\n    . \"$beddDir\\harness-shim.ps1\"\n    Register-BeDDNative ([MyE2E.Native])   # optional, see below\n}\n# after deploying your mod and moving the other mods aside:\nif ($script:Headless) { Install-BeDDMod -ModsDir $script:ModsDir -PipeName 'BeDD-<instance>' }\n# ... and in finally, once the game is closed:\nif ($script:Headless) { Uninstall-BeDDMod -ModsDir $script:ModsDir }\n```\n\nStart games with `Start-BeDDGame.ps1` rather than the launcher, and keep `BeDD`\nout of any \"move other mods aside\" step: it is installed fresh each run and removed afterwards (a\nleftover copy would make a normally started game ignore your mouse and keyboard).\n\nIf your scenarios call the harness's own input class directly (`[MyE2E.Native]::Key(0x10, $false)`\nand friends), give it these fields and a one-line guard at the top of each method;\n`Register-BeDDNative` fills them:\n\n```csharp\npublic static Action<ushort, bool> KeyRedirect;          // (vk, up)\npublic static Action<int, bool>    MouseButtonRedirect;  // (0 left / 1 right / 2 middle, up)\npublic static Action<int>          WheelRedirect;        // (delta, 120 per notch)\npublic static Action<char>         UnicodeRedirect;\npublic static Action<int, int>     MoveRelativeRedirect; // camera\npublic static void Key(ushort vk, bool up) { if (KeyRedirect != null) { KeyRedirect(vk, up); return; } /* SendInput as before */ }\n```\n\n[BeetrootSkin](https://github.com/LiteLDev/BeetrootSkin/tree/main/tools/e2e) and\n[AlleviatedBackpacks](https://github.com/LiteLDev/AlleviatedBackpacks/tree/main/tools/e2e) have\ncomplete harnesses to copy from.\n\n## Settings\n\n`mods\\BeDD\\config\\config.json`, usually written by the harness\n(`Install-BeDDMod` does it). Without it the mod stays passive: background mode off, the\npipe still answers. `Install-BeDDMod` and `Start-BeDDGame.ps1` also switch the\ninstance's LeviLamina to its built-in crash logger (`modules.crashLogger.builtin` in\n`mods\\LeviLamina\\config\\Config.json`): the default `CrashLogger.exe` is a console program, and its\nconsole window would flash on the desktop at every game start.\n\n```json\n{ \"background\": true, \"placement\": \"back\", \"clientWidth\": 1600, \"clientHeight\": 900, \"pipeName\": \"BeDD\" }\n```\n\n| Key | |\n|---|---|\n| `background` | keep the game in the background and away from your real mouse and keyboard |\n| `placement` | `back` (behind your windows), `offscreen` or `none` |\n| `clientWidth`, `clientHeight` | game window size (0 = leave it), so clicks land in the same place every run |\n| `pipeName` | one per game instance when several run at once |\n| `loopbackOnly` | default `true`: the game stays on the PC, so no Windows Firewall prompt for each new instance, and game servers outside the PC are not queried (they could show up as \"LAN worlds\" ahead of your test world). Dedicated servers your harness starts still ask once per server folder; **Cancel** is fine |\n| `manager` | default `true`: in background mode the game shows up in the manager window when one runs, and its own window stays off screen and off the taskbar |\n| `mute` | default `true`: in background mode the game makes no sound (it is audible again while you take it over) |\n| `trace` | log every input that reaches the game to `logs\\latest.log`, for bug reports |\n\n## More\n\nMore videos and pictures: https://levimc.org/mods/github.com/LiteLDev/BeDD/?tab=gallery\n\nBuilding it yourself, the pipe protocol or how it works inside? See [CONTRIBUTING.md](CONTRIBUTING.md#development).\n\n## License\n\n[LGPL-3.0-or-later](COPYING.LESSER) © LeviMC. GameInput interface layouts follow Microsoft's public\n`GameInput.h` (v2); no Microsoft code is included.\n"},{"file":"README.zh-CN.md","lang":"zh-Hans","text":"# Be.D.D.\n\n<img src=\"docs/logo.png\" alt=\"\" width=\"128\" align=\"right\">\n\n[English](README.md) | 简体中文\n\n[![Release](https://img.shields.io/github/v/release/LiteLDev/BeDD)](https://github.com/LiteLDev/BeDD/releases)\n[![License](https://img.shields.io/github/license/LiteLDev/BeDD)](COPYING.LESSER)\n\nBe.D.D.（Bedrock Deep Dive）得名自《绝区零》的 H.D.D.：绳匠在远处引导代理人穿行空洞，你的脚本在后台引导 Minecraft。\n\n让 [LeviLamina](https://github.com/LiteLDev/LeviLamina) 客户端模组的端到端测试**在后台跑**。\n脚本在 Minecraft 基岩版里按键、打字、点击，你的鼠标、键盘和窗口照常归你用，还能同时开好几个游戏一起测。\n\n<p align=\"center\"><img src=\"docs/showcase/desktop.webp\" alt=\"三个 Minecraft 窗口跟着测试脚本动，前面的终端一直保持焦点\" width=\"100%\"></p>\n\n> [!WARNING]\n> 这是**测试工具**。后台模式开着时，游戏不理会你真实的鼠标和键盘。别把它留在平时玩的游戏里\n> （在游戏窗口按 **Ctrl+Shift+F12** 可以关掉后台模式）。\n\n## 功能\n\n- **测试时照常用电脑。** 游戏不抢前台、不锁鼠标、不吃你的按键，你点哪儿都不会点进游戏里。\n- **多开一起测。** 每个游戏实例一条自己的管道；克隆一个实例只要几秒钟。\n- **一个窗口看全部。** 电脑上所有测试的游戏都实时显示在同一个管理窗口里，不会在桌面上弹来弹去；关掉它就关掉全部游戏。\n- **跟真人玩一样。** 按键、聊天、键位绑定、菜单、悬停提示、点击、转视角都和真鼠标键盘一样生效。\n- **结果确定。** 每个调用都等游戏处理完输入才返回，不用靠猜的 `sleep`。\n- **窗口被挡住也能截图。** 游戏可以躲在你其他窗口后面。\n- **直接接进现有测试框架。** 一个文件替换掉 LeviLauncher 测试框架里常见的 `Click`、`Press-Key`、`Focus-Game` 等函数，测试场景一行不用改。\n\n<p align=\"center\"><img src=\"docs/showcase/how-it-feels.svg\" alt=\"你的输入只到你自己的应用；脚本通过各自的管道驱动三个后台游戏\" width=\"100%\"></p>\n\n## 安装\n\n装进跑测试的那个游戏实例，例如用 [lip](https://github.com/LiteLDev/lip)：\n\n```powershell\nlip install github.com/LiteLDev/BeDD#client\n```\n\n也可以从 [Releases](https://github.com/LiteLDev/BeDD/releases) 下载\n`bedd-client-windows-x64.zip`，解压到该实例的 `mods\\` 目录。多数测试框架会在每次运行开始时自己放进去、结束后删掉\n（[见下文](#接入测试框架)）。\n\n需要 Minecraft 基岩版 **1.26.51**（GDK 版）和 LeviLamina **26.51.x**（客户端），装在用 LeviLauncher 安装的游戏实例里。\n测试时用 `Start-BeDDGame.ps1` 启动这个实例，不走启动器（[见下文](#多开)）。只有测试机上的游戏需要装，服务器和玩家都不用。\n\n## 使用方法\n\nPowerShell 模块就放在模组旁边：\n\n```powershell\nImport-Module .\\mods\\BeDD\\BeDD.psm1\nConnect-BeDD                          # 等游戏启动好\nSend-BeDDKey E                             # 打开背包\nSend-BeDDMouse click -RX 0.5 -RY 0.474     # 按窗口比例位置点击\nSend-BeDDKey T; Send-BeDDText '/give @s apple 3'; Send-BeDDKey ENTER\nSave-BeDDScreenshot C:\\temp\\shot.png       # 窗口被挡住也能截\n```\n\n| 命令 | 作用 |\n|---|---|\n| `Connect-BeDD [-PipeName p]` | 等游戏就绪，并选定之后的调用发给哪个游戏 |\n| `Send-BeDDKey E` | 按一下键；`-Action down`/`up` 按住或松开，`-Vk 0x10` 指定任意虚拟键码 |\n| `Send-BeDDText '...'` | 输入文字（不产生按键，所以 `t` 不会打开聊天栏）；`-DelayMs` 设定每个字的间隔 |\n| `Send-BeDDMouse click -RX 0.5 -RY 0.5` | `move`、`down`、`up`、`click`、`wheel`，位置用 `-X -Y` 像素或 `-RX -RY` 比例；`-Button right` 右键 |\n| `Send-BeDDRaw move -Dx 200` | 在世界里转视角；`click -Button right` 使用物品 |\n| `Clear-BeDDInput` | 松开所有还按着的键和鼠标按钮 |\n| `Save-BeDDScreenshot path.png` / `Get-BeDDBitmap` | 游戏画面，被挡住也照样截 |\n| `Set-BeDDWindow 1600 900` | 调整游戏窗口大小，不会把它提到前面 |\n| `Set-BeDDBackground $false` | 把游戏交还给你的真鼠标和键盘 |\n| `Get-BeDDState` | 游戏是否在线、收到了多少输入、是否抢过前台 |\n\n按键名：字母、数字、`ESC`、`ENTER`、`BACK`、`TAB`、`SPACE`、`SHIFT`、`CTRL`、`ALT`、方向键（`LEFT` 等）、\n`HOME`、`END`、`PGUP`、`PGDN`、`INSERT`、`DELETE`、`F1`..`F24`、`SLASH`、`GRAVE`、`MINUS`、`EQUALS`。\n\n### 多开\n\n```powershell\npwsh -NoProfile -File clone-instance.ps1 -Slot 2                  # versions\\1.26.51.01-hi2，约 90 MB，几秒钟\n& .\\Start-BeDDGame.ps1 -Instance 1.26.51.01-hi2                # 启动时不把窗口提到前面\nConnect-BeDD -PipeName BeDD-1.26.51.01-hi2   # 该实例配置里的 pipeName\n```\n\n克隆出来的实例有自己的 `mods\\`、日志、存档和设置。几条规矩，免得并行的测试互相打架：\n\n- 每个实例用自己的锁文件；按**实例目录**找自己的游戏进程，别只看进程名 `Minecraft.Windows`（不然会关掉别人的游戏）。\n- 一定以 `Minecraft.Windows.exe` 这个文件名启动（`Start-BeDDGame.ps1` 就是这样做的）：换个名字，游戏会悄悄改用你平时玩的\n  Minecraft 存档目录，而不是这个实例的。\n- 测试存档用 `Set-WorldSinglePlayer <存档目录>`（框架垫片里提供）设成单人：同一台电脑上的游戏共用一个联机登录，\n  多个多人存档同时打开会报\"发生错误\"（代码 \"Blaze\"）。\n- 需要在线加入服务器的测试，在 `Start-Game` 之前设 `$script:ExclusiveSignaling = $true`，等其他游戏关掉后独占整台电脑。\n\n### 管理窗口\n\n本次登录后第一次运行 `Start-BeDDGame.ps1` 时会打开**管理窗口**，之后的运行（不管来自哪个终端、测试框架或 agent）都复用它。\n每个后台游戏都以实时画面显示在里面，不再有自己的窗口：任务栏上没有按钮，Alt+Tab 里也没有，多个测试同时启动、关闭游戏时\n桌面上不会有窗口弹出又消失。它也从不抢焦点。\n\n- 每个游戏标注启动它的脚本所在的项目（和 worktree）、实例名、pid，以及是否正在收到输入。`Start-BeDDGame.ps1 -Label` 可以自己起名。\n- **关掉管理窗口会关掉里面所有的游戏**（会先确认）。管理窗口被强制结束时游戏也会一起退出，不会在后台留下游戏。\n- 双击某个游戏只看它一个。右键可以用自己的鼠标键盘接管它（以及交还给脚本）、打开它的 `latest.log` 或实例目录、或者关掉它。\n- 脚本里：`BeDDManager.ps1 -List` 列出游戏，`-Game <pid> -Action show|hide|close` 做右键菜单的事，\n  `-Shutdown` 不经确认关掉管理窗口和所有游戏。\n\n需要 PowerShell 7（`pwsh`）。`Start-BeDDGame.ps1 -NoManager`（或 `BEDD_MANAGER=0`）启动游戏时不启动管理窗口；\n`Install-BeDDMod -NoManager`（配置 `\"manager\": false`）让游戏不进已经开着的管理窗口，比如要录制真实屏幕的时候。\n\n### 接入测试框架\n\n`harness-shim.ps1` 原地替换 LeviLauncher 测试框架的常用函数（`Focus-Game`、`Assert-GameForeground`、\n`Set-GameWindowSize`、`Move-Mouse`、`Click`、`Scroll`、`Press-Key`、`Type-Text`、`Get-ClientBitmap`，参数不变），\n并包装 `Start-Game`/`Stop-Game`：\n\n```powershell\n. \"$PSScriptRoot/lib.ps1\"\nif (-not $Foreground) {\n    . \"$beddDir\\harness-shim.ps1\"\n    Register-BeDDNative ([MyE2E.Native])   # 可选，见下文\n}\n# 部署完你的模组、把其他模组挪开之后：\nif ($script:Headless) { Install-BeDDMod -ModsDir $script:ModsDir -PipeName 'BeDD-<实例名>' }\n# ……在 finally 里、游戏关掉之后：\nif ($script:Headless) { Uninstall-BeDDMod -ModsDir $script:ModsDir }\n```\n\n游戏用 `Start-BeDDGame.ps1` 启动，不要走启动器；\"把其他模组挪开\"那一步要跳过 `BeDD`：它每次运行都重新装、\n结束就删（留下一份的话，正常启动的游戏会不理你的鼠标键盘）。\n\n如果测试场景直接调用框架自己的输入类（比如 `[MyE2E.Native]::Key(0x10, $false)`），给这个类加上下面几个字段，\n并在每个方法开头加一行判断，`Register-BeDDNative` 会把它们填好：\n\n```csharp\npublic static Action<ushort, bool> KeyRedirect;          // (vk, up)\npublic static Action<int, bool>    MouseButtonRedirect;  // (0 左 / 1 右 / 2 中, up)\npublic static Action<int>          WheelRedirect;        // (delta，每格 120)\npublic static Action<char>         UnicodeRedirect;\npublic static Action<int, int>     MoveRelativeRedirect; // 视角\npublic static void Key(ushort vk, bool up) { if (KeyRedirect != null) { KeyRedirect(vk, up); return; } /* 原来的 SendInput */ }\n```\n\n完整的测试框架可以参考 [BeetrootSkin](https://github.com/LiteLDev/BeetrootSkin/tree/main/tools/e2e) 和\n[AlleviatedBackpacks](https://github.com/LiteLDev/AlleviatedBackpacks/tree/main/tools/e2e)。\n\n## 设置\n\n`mods\\BeDD\\config\\config.json`，一般由测试框架写入（`Install-BeDDMod` 会写）。\n没有这个文件时模组是被动的：后台模式关闭，管道照样能用。`Install-BeDDMod` 和 `Start-BeDDGame.ps1`\n还会把实例的 LeviLamina 切到内置崩溃记录器（`mods\\LeviLamina\\config\\Config.json` 里的\n`modules.crashLogger.builtin`）：默认的 `CrashLogger.exe` 是控制台程序，每次启动游戏都会在桌面上闪一下黑窗口。\n\n```json\n{ \"background\": true, \"placement\": \"back\", \"clientWidth\": 1600, \"clientHeight\": 900, \"pipeName\": \"BeDD\" }\n```\n\n| 键 | |\n|---|---|\n| `background` | 让游戏待在后台，不受你真鼠标键盘的影响 |\n| `placement` | `back`（放到你的窗口后面）、`offscreen`（移出屏幕）或 `none` |\n| `clientWidth`、`clientHeight` | 游戏窗口大小（0 表示不改），每次运行点击位置都一样 |\n| `pipeName` | 多开时每个实例一个 |\n| `loopbackOnly` | 默认 `true`：游戏只在本机通信，新实例不会弹 Windows 防火墙提示，也不会去查询本机以外的游戏服务器（否则它们可能以\"局域网世界\"出现在测试存档前面）。测试框架自己启动的专用服务器每个服务器目录还是会问一次，点**取消**即可 |\n| `manager` | 默认 `true`：后台模式下，有管理窗口时游戏显示在管理窗口里，自己的窗口留在屏幕外、不进任务栏 |\n| `mute` | 默认 `true`：后台模式下游戏不出声（你接管游戏时恢复声音） |\n| `trace` | 把到达游戏的每个输入写进 `logs\\latest.log`，报 bug 时用 |\n\n## 更多\n\n更多视频和截图：https://levimc.org/mods/github.com/LiteLDev/BeDD/?tab=gallery\n\n想自己构建、了解管道协议或内部原理？见 [CONTRIBUTING.md](CONTRIBUTING.md#development)。\n\n## 许可证\n\n[LGPL-3.0-or-later](COPYING.LESSER) © LeviMC。GameInput 接口布局参考微软公开的 `GameInput.h`（v2），不包含任何微软代码。\n"}],"gallery":[{"kind":"video","src":"/mods/showcase/LiteLDev/BeDD/desktop.mp4","poster":"/mods/showcase/LiteLDev/BeDD/desktop-poster.webp","width":1280,"height":720,"title":{"en":"Three games, one desktop, your PC stays yours","zh-CN":"三个游戏，一张桌面，电脑照样归你用"},"caption":{"en":"A test script drives three Minecraft instances at once while the terminal in front keeps the focus. Recorded from the real screen.","zh-CN":"测试脚本同时驱动三个 Minecraft 实例，前面的终端始终保持焦点。录的是真实屏幕。"}},{"kind":"video","src":"/mods/showcase/LiteLDev/BeDD/script-and-game.mp4","poster":"/mods/showcase/LiteLDev/BeDD/script-and-game-poster.webp","width":1280,"height":360,"title":{"en":"Every line, live in the game","zh-CN":"脚本每一行，游戏里立刻生效"},"caption":{"en":"Send-BeDDKey E opens the inventory, Send-BeDDMouse hovers and moves the sword, ESC closes it, in a window you never clicked.","zh-CN":"Send-BeDDKey E 打开背包，Send-BeDDMouse 悬停、挪动钻石剑，ESC 关闭，全程不用点那个窗口。"}},{"kind":"svg","src":"/mods/showcase/LiteLDev/BeDD/how-it-feels.svg","width":1280,"height":720,"title":{"en":"Your input stays yours","zh-CN":"你的输入只归你"},"caption":{"en":"Your mouse and keyboard go to your apps; the script reaches each game over its own pipe and gets an answer once the game has handled the input.","zh-CN":"鼠标键盘只给你自己的应用；脚本通过各自的管道发给每个游戏，游戏处理完才返回。"}},{"kind":"image","src":"/mods/showcase/LiteLDev/BeDD/chat-summon.webp","width":1280,"height":720,"title":{"en":"Chat commands, typed for you","zh-CN":"聊天命令，替你输入"},"caption":{"en":"Send-BeDDText types '/summon sheep' and '/summon cow' into chat; the game runs them like a player typed them.","zh-CN":"Send-BeDDText 在聊天栏里输入 /summon sheep 和 /summon cow，游戏就像玩家亲手输入一样执行。"}},{"kind":"image","src":"/mods/showcase/LiteLDev/BeDD/inventory-hover.webp","width":1280,"height":720,"title":{"en":"Hover and click where you aim","zh-CN":"指哪儿悬停，指哪儿点"},"caption":{"en":"A virtual cursor brings up tooltips and clicks slots; this picture is Save-BeDDScreenshot of a window that was off the screen.","zh-CN":"虚拟光标能触发物品提示、点击格子；这张图就是 Save-BeDDScreenshot 对一个移出屏幕的窗口截的。"}},{"kind":"image","src":"/mods/showcase/LiteLDev/BeDD/desktop-poster.webp","width":1280,"height":720,"title":{"en":"The games never take the focus","zh-CN":"游戏从不抢焦点"},"caption":{"en":"Look at the title bars: only the terminal is active. Each game runs from its own cheap clone of the instance.","zh-CN":"看标题栏：只有终端是激活的。每个游戏都跑在自己的实例克隆里，克隆又快又省空间。"}}],"variants":[{"label":"client","versions":["0.3.1","0.3.0"]}],"versions":[{"version":"0.3.1","prerelease":false,"released":"2026-10-30T00:22:13Z","releaseUrl":"https://github.com/LiteLDev/BeDD/releases/tag/v0.3.1","manifestUrl":"https://github.com/LiteLDev/BeDD/blob/v0.3.1/tooth.json","info":{"name":"Be.D.D.","description":"Drive a Minecraft Bedrock Edition client from test scripts without touching the real mouse, keyboard or foreground window","tags":["platform:levilamina","type:mod","client","testing","category:developer","automation","input"],"avatar_url":"https://raw.githubusercontent.com/LiteLDev/BeDD/main/docs/logo.png"},"variants":[{"label":"client","platform":"win-x64","dependencies":{"github.com/LiteLDev/LeviLamina#client":"26.51.*"},"leviLamina":"26.51.*","install":"lip install github.com/LiteLDev/BeDD#client@0.3.1"}]},{"version":"0.3.0","prerelease":false,"released":"2026-10-30T00:12:10Z","releaseUrl":"https://github.com/LiteLDev/BeDD/releases/tag/v0.3.0","manifestUrl":"https://github.com/LiteLDev/BeDD/blob/v0.3.0/tooth.json","info":{"name":"BeDD","description":"Drive a Minecraft Bedrock Edition client from test scripts without touching the real mouse, keyboard or foreground window","tags":["platform:levilamina","type:mod","client","testing","category:developer","automation","input"],"avatar_url":"https://raw.githubusercontent.com/LiteLDev/BeDD/main/docs/logo.png"},"variants":[{"label":"client","platform":"win-x64","dependencies":{"github.com/LiteLDev/LeviLamina#client":"26.51.*"},"leviLamina":"26.51.*","install":"lip install github.com/LiteLDev/BeDD#client@0.3.0"}]}],"dependencies":{"github.com/liteldev/levilamina":{"tooth":"github.com/LiteLDev/LeviLamina","name":"LeviLamina","owner":"LiteLDev","url":"https://levimc.org/mods/github.com/LiteLDev/LeviLamina/"}},"requiredBy":[]}