fix(computer-use): pace modified Windows multiclicks

This commit is contained in:
Neil
2026-07-29 18:08:34 -07:00
parent 6277f6645e
commit 01b926828f
2 changed files with 21 additions and 12 deletions
@@ -24,16 +24,25 @@ describe('computer-use modifier safety', () => {
expect(clickInput).not.toContain('down: true')
})
it('submits the complete modified click in one Windows SendInput batch', () => {
it('submits each modified Windows click in a closed, timed SendInput batch', () => {
const windows = source('native/computer-use-windows/runtime.ps1')
const modifiedClick = windows.slice(
windows.indexOf('public static void SendModifiedClick'),
windows.indexOf('private static INPUT KeyboardInput')
)
const mouseClick = windows.slice(
windows.indexOf('function Send-OrcaMouseClick'),
windows.indexOf('function Send-OrcaDrag')
)
expect(modifiedClick).toContain('SendInput((uint)values.Length, values')
expect(modifiedClick).toContain('SendInput((uint)releaseValues.Length, releaseValues')
expect(modifiedClick).toContain('if (sent != (uint)values.Length)')
expect(modifiedClick).not.toContain('int count')
expect(mouseClick).toMatch(
/for \(\$i = 0; \$i -lt \$clickCount; \$i\+\+\) \{\s+\[OrcaDesktopWin32\]::SendModifiedClick\(/
)
expect(mouseClick).toContain('if ($i + 1 -lt $clickCount) { Start-Sleep -Milliseconds 35 }')
expect(windows).not.toContain('keybd_event')
})
+11 -11
View File
@@ -94,7 +94,7 @@ public static class OrcaDesktopWin32 {
[DllImport("user32.dll")]
public static extern uint SendInput(uint count, INPUT[] inputs, int size);
public static void SendModifiedClick(byte[] modifiers, uint mouseDown, uint mouseUp, int count) {
public static void SendModifiedClick(byte[] modifiers, uint mouseDown, uint mouseUp) {
const uint keyboardInput = 1;
const uint mouseInput = 0;
const uint keyUp = 0x0002;
@@ -102,10 +102,8 @@ public static class OrcaDesktopWin32 {
foreach (var modifier in modifiers) {
inputs.Add(KeyboardInput(keyboardInput, modifier, 0));
}
for (var index = 0; index < count; index++) {
inputs.Add(MouseInput(mouseInput, mouseDown));
inputs.Add(MouseInput(mouseInput, mouseUp));
}
inputs.Add(MouseInput(mouseInput, mouseDown));
inputs.Add(MouseInput(mouseInput, mouseUp));
for (var index = modifiers.Length - 1; index >= 0; index--) {
inputs.Add(KeyboardInput(keyboardInput, modifiers[index], keyUp));
}
@@ -1016,12 +1014,14 @@ function Send-OrcaMouseClick([IntPtr]$WindowHandle, [int]$ScreenX, [int]$ScreenY
}
return
}
[OrcaDesktopWin32]::SendModifiedClick(
[byte[]]$modifierKeys,
[uint32]$down,
[uint32]$up,
$clickCount
)
for ($i = 0; $i -lt $clickCount; $i++) {
[OrcaDesktopWin32]::SendModifiedClick(
[byte[]]$modifierKeys,
[uint32]$down,
[uint32]$up
)
if ($i + 1 -lt $clickCount) { Start-Sleep -Milliseconds 35 }
}
}
function Send-OrcaDrag([IntPtr]$WindowHandle, $From, $To) {