@bobfrankston/winpos 2.0.48 → 2.0.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/screens.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"screens.d.ts","sourceRoot":"","sources":["screens.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,UAAU;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,gBAAgB,IAAI,UAAU,EAAE,CAwE/C;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAO/D"}
package/screens.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"screens.js","sourceRoot":"","sources":["screens.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAQ,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAe7E,MAAM,UAAU,gBAAgB;IAC5B,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,sDAAsD;IACtD,IAAI,KAAK,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IACjG,CAAC;IAED,IAAI,CAAC;QACD,mEAAmE;QACnE,MAAM,eAAe,GAAG,CAAC,QAAa,EAAE,UAAe,EAAE,WAAgB,EAAE,MAAW,EAAW,EAAE;YAC/F,IAAI,CAAC;gBACD,MAAM,WAAW,GAAQ,EAAE,CAAC;gBAC5B,IAAI,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;oBAChD,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;oBACxC,OAAO,CAAC,IAAI,CAAC;wBACT,UAAU,EAAE,iBAAiB,YAAY,GAAG,CAAC,EAAE;wBAC/C,MAAM,EAAE;4BACJ,IAAI,EAAE,SAAS,CAAC,IAAI;4BACpB,GAAG,EAAE,SAAS,CAAC,GAAG;4BAClB,KAAK,EAAE,SAAS,CAAC,KAAK;4BACtB,MAAM,EAAE,SAAS,CAAC,MAAM;4BACxB,KAAK,EAAE,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI;4BACvC,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG;yBAC3C;wBACD,OAAO,EAAE,CAAC,WAAW,CAAC,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC;qBAC9D,CAAC,CAAC;oBACH,YAAY,EAAE,CAAC;gBACnB,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAC;YACnD,CAAC;YACD,OAAO,IAAI,CAAC,CAAC,uBAAuB;QACxC,CAAC,CAAC;QAEF,iCAAiC;QACjC,MAAM,CAAC,mBAAmB,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,CAAC,CAAC,CAAC;QAChD,4BAA4B;QAC5B,OAAO,CAAC,IAAI,CAAC;YACT,UAAU,EAAE,iBAAiB;YAC7B,MAAM,EAAE;gBACJ,IAAI,EAAE,CAAC;gBACP,GAAG,EAAE,CAAC;gBACN,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,IAAI;aACf;YACD,OAAO,EAAE,IAAI;SAChB,CAAC,CAAC;IACP,CAAC;IAED,8CAA8C;IAC9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC;YACT,UAAU,EAAE,iBAAiB;YAC7B,MAAM,EAAE;gBACJ,IAAI,EAAE,CAAC;gBACP,GAAG,EAAE,CAAC;gBACN,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,IAAI;aACf;YACD,OAAO,EAAE,IAAI;SAChB,CAAC,CAAC;IACP,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAqB;IAC7C,qDAAqD;IACrD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACzB,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG;YAC7B,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QACzC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IACvC,CAAC,CAAC,CAAC;AACP,CAAC"}
package/screens.ts DELETED
@@ -1,101 +0,0 @@
1
- /**
2
- * Screen management - enumerate and sort displays
3
- */
4
-
5
- import { user32, RECT, isBun, MONITORINFOF_PRIMARY } from './ffi-wrapper.js';
6
-
7
- export interface ScreenInfo {
8
- deviceName: string;
9
- bounds: {
10
- Left: number;
11
- Top: number;
12
- Right: number;
13
- Bottom: number;
14
- Width: number;
15
- Height: number;
16
- };
17
- primary: boolean;
18
- }
19
-
20
- export function enumerateScreens(): ScreenInfo[] {
21
- const screens: ScreenInfo[] = [];
22
- let monitorIndex = 0;
23
-
24
- // Bun FFI for monitor enumeration not yet implemented
25
- if (isBun) {
26
- throw new Error('Multi-monitor support is not yet implemented for Bun. Please use Node.js.');
27
- }
28
-
29
- try {
30
- // Define callback function - closures should work in Node.js koffi
31
- const monitorCallback = (hMonitor: any, hdcMonitor: any, lprcMonitor: any, dwData: any): boolean => {
32
- try {
33
- const monitorInfo: any = {};
34
- if (user32.GetMonitorInfoW(hMonitor, monitorInfo)) {
35
- const rcMonitor = monitorInfo.rcMonitor;
36
- screens.push({
37
- deviceName: `\\\\.\\DISPLAY${monitorIndex + 1}`,
38
- bounds: {
39
- Left: rcMonitor.Left,
40
- Top: rcMonitor.Top,
41
- Right: rcMonitor.Right,
42
- Bottom: rcMonitor.Bottom,
43
- Width: rcMonitor.Right - rcMonitor.Left,
44
- Height: rcMonitor.Bottom - rcMonitor.Top,
45
- },
46
- primary: (monitorInfo.dwFlags & MONITORINFOF_PRIMARY) !== 0,
47
- });
48
- monitorIndex++;
49
- }
50
- } catch (e) {
51
- console.error('Error in monitor callback:', e);
52
- }
53
- return true; // Continue enumeration
54
- };
55
-
56
- // Enumerate all display monitors
57
- user32.EnumDisplayMonitors(monitorCallback, 0n);
58
- } catch (e) {
59
- console.error('Error enumerating monitors:', e);
60
- // Fallback to single screen
61
- screens.push({
62
- deviceName: '\\\\.\\DISPLAY1',
63
- bounds: {
64
- Left: 0,
65
- Top: 0,
66
- Right: 1920,
67
- Bottom: 1080,
68
- Width: 1920,
69
- Height: 1080,
70
- },
71
- primary: true,
72
- });
73
- }
74
-
75
- // If no screens were found, add a default one
76
- if (screens.length === 0) {
77
- screens.push({
78
- deviceName: '\\\\.\\DISPLAY1',
79
- bounds: {
80
- Left: 0,
81
- Top: 0,
82
- Right: 1920,
83
- Bottom: 1080,
84
- Width: 1920,
85
- Height: 1080,
86
- },
87
- primary: true,
88
- });
89
- }
90
-
91
- return screens;
92
- }
93
-
94
- export function sortScreens(screens: ScreenInfo[]): ScreenInfo[] {
95
- // Sort by top (descending), then by left (ascending)
96
- return screens.sort((a, b) => {
97
- if (a.bounds.Top === b.bounds.Top)
98
- return a.bounds.Left - b.bounds.Left;
99
- return b.bounds.Top - a.bounds.Top;
100
- });
101
- }
package/tabs.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["tabs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,OAAO;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACjB;AA8BD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAiB3E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAgB1D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAI5D;AAGD,eAAO,MAAM,oBAAoB,ouBAmBhC,CAAC"}
package/tabs.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"tabs.js","sourceRoot":"","sources":["tabs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAQzC,IAAI,YAAY,GAAQ,IAAI,CAAC;AAE7B,KAAK,UAAU,sBAAsB;IACjC,IAAI,KAAK,EAAE,CAAC;QACR,wCAAwC;QACxC,OAAO,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,CAAC;QACD,iEAAiE;QACjE,wEAAwE;QACxE,yDAAyD;QAEzD,sBAAsB;QACtB,qCAAqC;QACrC,sCAAsC;QACtC,wDAAwD;QACxD,kDAAkD;QAClD,+CAA+C;QAE/C,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY;IAC5C,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,YAAY,GAAG,MAAM,sBAAsB,EAAE,CAAC;IAClD,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,0CAA0C;IAC1C,sBAAsB;IACtB,yCAAyC;IACzC,qEAAqE;IACrE,8CAA8C;IAC9C,8BAA8B;IAE9B,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC7C,MAAM,OAAO,GAAG;QACZ,QAAQ;QACR,MAAM;QACN,SAAS;QACT,UAAU;QACV,kBAAkB;QAClB,oBAAoB;QACpB,MAAM;QACN,WAAW;QACX,SAAS;QACT,SAAS;KACZ,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAC9C,0CAA0C;IAC1C,8BAA8B;IAC9B,OAAO,EAAE,CAAC;AACd,CAAC;AAED,kCAAkC;AAClC,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;CAmBnC,CAAC"}
package/tabs.ts DELETED
@@ -1,133 +0,0 @@
1
- /**
2
- * Tab enumeration support using Windows UI Automation API
3
- *
4
- * NOTE: Tab enumeration is application-specific and not all apps expose tabs
5
- * through Windows APIs. This module uses UI Automation to attempt to find tabs.
6
- *
7
- * Windows Terminal, Chrome, Edge, and other modern apps may expose tabs via
8
- * UI Automation, but success varies by application.
9
- */
10
-
11
- import { isBun } from './ffi-wrapper.js';
12
-
13
- export interface TabInfo {
14
- name: string;
15
- automationId: string;
16
- index: number;
17
- }
18
-
19
- let uiAutomation: any = null;
20
-
21
- async function initializeUIAutomation(): Promise<any> {
22
- if (isBun) {
23
- // Bun doesn't have good COM support yet
24
- console.warn('Tab enumeration not supported in Bun runtime');
25
- return null;
26
- }
27
-
28
- try {
29
- // UI Automation requires COM interop which is complex with koffi
30
- // For now, return null - this would require significant additional work
31
- // with COM initialization, IUIAutomation interface, etc.
32
-
33
- // Potential approach:
34
- // 1. Load oleaut32.dll and ole32.dll
35
- // 2. Call CoInitialize/CoInitializeEx
36
- // 3. Create IUIAutomation instance via CoCreateInstance
37
- // 4. Use FindFirst/FindAll to locate tab controls
38
- // 5. Read properties from IUIAutomationElement
39
-
40
- return null;
41
- } catch (error: any) {
42
- console.error('Failed to initialize UI Automation:', error.message);
43
- return null;
44
- }
45
- }
46
-
47
- /**
48
- * Attempt to enumerate tabs for a window
49
- *
50
- * @param hwnd Window handle
51
- * @returns Array of tab information, or null if not supported/available
52
- *
53
- * NOTE: This is a placeholder for future implementation. Tab enumeration
54
- * requires COM interop with UI Automation API which is complex with FFI.
55
- *
56
- * For now, this returns null. A full implementation would require:
57
- * - COM initialization (CoInitialize)
58
- * - IUIAutomation interface
59
- * - Element tree traversal
60
- * - Property reading from automation elements
61
- */
62
- export async function enumerateTabs(hwnd: bigint): Promise<TabInfo[] | null> {
63
- if (!uiAutomation) {
64
- uiAutomation = await initializeUIAutomation();
65
- }
66
-
67
- if (!uiAutomation) {
68
- return null;
69
- }
70
-
71
- // TODO: Implement UI Automation traversal
72
- // This would involve:
73
- // 1. Get root element from window handle
74
- // 2. Search for elements with ControlType_Tab or ControlType_TabItem
75
- // 3. Read Name property from each tab element
76
- // 4. Return array of tab info
77
-
78
- return null;
79
- }
80
-
81
- /**
82
- * Check if a window potentially has tabs
83
- * This is a heuristic based on window class name
84
- */
85
- export function mightHaveTabs(windowTitle: string): boolean {
86
- const tabApps = [
87
- 'chrome',
88
- 'edge',
89
- 'firefox',
90
- 'terminal',
91
- 'windows terminal',
92
- 'visual studio code',
93
- 'code',
94
- 'notepad++',
95
- 'sublime',
96
- 'browser'
97
- ];
98
-
99
- const lowerTitle = windowTitle.toLowerCase();
100
- return tabApps.some(app => lowerTitle.includes(app));
101
- }
102
-
103
- /**
104
- * Alternative approach: Enumerate child windows
105
- * Some applications implement tabs as child windows
106
- */
107
- export function enumerateChildWindows(hwnd: bigint): bigint[] {
108
- // This would require EnumChildWindows API
109
- // For now, return empty array
110
- return [];
111
- }
112
-
113
- // Export a note about limitations
114
- export const TAB_ENUMERATION_NOTE = `
115
- Tab Enumeration Limitations:
116
-
117
- Windows does not provide a standard API for enumerating tabs within applications.
118
- Tabs are application-specific UI elements. To enumerate tabs, you would need:
119
-
120
- 1. UI Automation API (requires COM interop - complex with FFI)
121
- 2. Application-specific APIs (e.g., Chrome DevTools Protocol)
122
- 3. Accessibility APIs (Windows Automation)
123
-
124
- Current status: Not implemented due to COM complexity.
125
-
126
- Alternative approaches:
127
- - Use application-specific automation (e.g., Puppeteer for Chrome)
128
- - Use Windows Automation PowerShell cmdlets
129
- - Use specialized tools like UIAutomationSpy
130
-
131
- For Windows Terminal specifically, tabs are accessible via Windows.UI.Xaml
132
- automation, but require UWP/WinRT interop.
133
- `;
package/tsconfig.json DELETED
@@ -1,29 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "esnext",
4
- "module": "NodeNext",
5
- "moduleResolution": "NodeNext",
6
- "allowSyntheticDefaultImports": true,
7
- "esModuleInterop": true,
8
- "allowJs": true,
9
- "strict": true,
10
- "forceConsistentCasingInFileNames": true,
11
- "skipLibCheck": true,
12
- "declaration": true,
13
- "declarationMap": true,
14
- "sourceMap": true,
15
- "strictNullChecks": false,
16
- "noImplicitAny": true,
17
- "noImplicitReturns": false,
18
- "noImplicitThis": true,
19
- "newLine": "lf",
20
- "resolveJsonModule": true
21
- },
22
- "exclude": [
23
- "node_modules",
24
- "cruft",
25
- ".git",
26
- "tests",
27
- "prev"
28
- ]
29
- }
package/windows.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"windows.d.ts","sourceRoot":"","sources":["windows.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAU,IAAI,EAA8D,MAAM,kBAAkB,CAAC;AAI5G,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEzG,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;CACd;AAKD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,QAgBlD;AAQD,wBAAgB,gBAAgB,CAAC,cAAc,GAAE,OAAe,GAAG,UAAU,EAAE,CA8D9E;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAelE;AAID,oBAAY,WAAW;IACnB,MAAM,WAAW;IACjB,SAAS,cAAc;IACvB,SAAS,cAAc;CAC1B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAMxD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAWxE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD"}
package/windows.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"windows.js","sourceRoot":"","sources":["windows.ts"],"names":[],"mappings":"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"}
package/windows.ts DELETED
@@ -1,200 +0,0 @@
1
- /**
2
- * Window enumeration and filtering
3
- */
4
-
5
- import { user32, RECT, isBun, SW_RESTORE, SW_MINIMIZE, SW_MAXIMIZE, SW_SHOWNORMAL } from './ffi-wrapper.js';
6
- import { readFileSync } from 'fs';
7
- import { join } from 'path';
8
-
9
- export { SW_RESTORE, SW_MINIMIZE, SW_MAXIMIZE, SW_SHOWNORMAL, SW_HIDE, SW_SHOW } from './ffi-wrapper.js';
10
-
11
- export interface WindowInfo {
12
- hwnd: bigint;
13
- title: string;
14
- rect: RECT;
15
- }
16
-
17
- let ignores: string[] = [];
18
- let ignoreStarts: string[] = [];
19
-
20
- export function loadIgnorePatterns(filePath: string) {
21
- try {
22
- const lines = readFileSync(filePath, 'utf-8').split('\n');
23
- for (const line of lines) {
24
- const trimmed = line.trim();
25
- if (!trimmed || trimmed.startsWith('#'))
26
- continue;
27
- if (trimmed.endsWith('*')) {
28
- ignoreStarts.push(trimmed.slice(0, -1));
29
- } else {
30
- ignores.push(trimmed);
31
- }
32
- }
33
- } catch (error: any) {
34
- // Ignore file doesn't exist - that's OK
35
- }
36
- }
37
-
38
- function shouldIgnoreWindow(title: string): boolean {
39
- const lowerTitle = title.toLowerCase();
40
- return ignores.some(ign => lowerTitle === ign.toLowerCase()) ||
41
- ignoreStarts.some(start => lowerTitle.startsWith(start.toLowerCase()));
42
- }
43
-
44
- export function enumerateWindows(includeIgnored: boolean = false): WindowInfo[] {
45
- const windows: WindowInfo[] = [];
46
-
47
- if (isBun) {
48
- // Bun implementation
49
- const { ptr } = (globalThis as any).Bun;
50
-
51
- const callback = (hwnd: bigint, lParam: bigint) => {
52
- const textBuf = new Uint16Array(256);
53
- const textPtr = ptr(textBuf);
54
- const length = user32.GetWindowTextW(hwnd, textPtr, 256);
55
-
56
- if (length > 0) {
57
- const title = String.fromCharCode(...textBuf.slice(0, length));
58
-
59
- if (includeIgnored || !shouldIgnoreWindow(title)) {
60
- const rect: RECT = { Left: 0, Top: 0, Right: 0, Bottom: 0 };
61
- const rectBuf = new Int32Array(4);
62
- const rectPtr = ptr(rectBuf);
63
-
64
- if (user32.GetWindowRect(hwnd, rectPtr)) {
65
- rect.Left = rectBuf[0];
66
- rect.Top = rectBuf[1];
67
- rect.Right = rectBuf[2];
68
- rect.Bottom = rectBuf[3];
69
-
70
- if (rect.Top !== rect.Bottom && rect.Left !== rect.Right) {
71
- windows.push({ hwnd, title, rect });
72
- }
73
- }
74
- }
75
- }
76
- return true;
77
- };
78
-
79
- user32.EnumWindows(callback, 0n);
80
- } else {
81
- // Node.js with koffi
82
- const callback = (hwnd: bigint, lParam: bigint) => {
83
- const textBuf = Buffer.alloc(512);
84
- const length = user32.GetWindowTextW(hwnd, textBuf as any, 256);
85
-
86
- if (length > 0) {
87
- const title = textBuf.toString('utf16le', 0, length * 2);
88
-
89
- if (includeIgnored || !shouldIgnoreWindow(title)) {
90
- const rect: RECT = { Left: 0, Top: 0, Right: 0, Bottom: 0 };
91
-
92
- if (user32.GetWindowRect(hwnd, rect)) {
93
- if (rect.Top !== rect.Bottom && rect.Left !== rect.Right) {
94
- windows.push({ hwnd, title, rect });
95
- }
96
- }
97
- }
98
- }
99
- return true;
100
- };
101
-
102
- user32.EnumWindows(callback, 0n);
103
- }
104
-
105
- return windows;
106
- }
107
-
108
- export function findWindowsByPattern(pattern: string): WindowInfo[] {
109
- const allWindows = enumerateWindows();
110
-
111
- if (pattern.startsWith('/') && pattern.endsWith('/')) {
112
- // Regex match
113
- const regex = new RegExp(pattern.slice(1, -1), 'i');
114
- return allWindows.filter(w => regex.test(w.title));
115
- } else if (pattern.endsWith('*')) {
116
- // Prefix match
117
- const prefix = pattern.slice(0, -1).toLowerCase();
118
- return allWindows.filter(w => w.title.toLowerCase().startsWith(prefix));
119
- } else {
120
- // Exact match
121
- return allWindows.filter(w => w.title.toLowerCase() === pattern.toLowerCase());
122
- }
123
- }
124
-
125
- // Window state management API
126
-
127
- export enum WindowState {
128
- Normal = 'normal',
129
- Minimized = 'minimized',
130
- Maximized = 'maximized'
131
- }
132
-
133
- /**
134
- * Get the current state of a window
135
- */
136
- export function getWindowState(hwnd: bigint): WindowState {
137
- if (user32.IsIconic(hwnd))
138
- return WindowState.Minimized;
139
- if (user32.IsZoomed(hwnd))
140
- return WindowState.Maximized;
141
- return WindowState.Normal;
142
- }
143
-
144
- /**
145
- * Set the state of a window
146
- */
147
- export function setWindowState(hwnd: bigint, state: WindowState): boolean {
148
- switch (state) {
149
- case WindowState.Minimized:
150
- return user32.ShowWindow(hwnd, SW_MINIMIZE);
151
- case WindowState.Maximized:
152
- return user32.ShowWindow(hwnd, SW_MAXIMIZE);
153
- case WindowState.Normal:
154
- return user32.ShowWindow(hwnd, SW_RESTORE);
155
- default:
156
- return false;
157
- }
158
- }
159
-
160
- /**
161
- * Check if a window is minimized
162
- */
163
- export function isMinimized(hwnd: bigint): boolean {
164
- return user32.IsIconic(hwnd);
165
- }
166
-
167
- /**
168
- * Check if a window is maximized
169
- */
170
- export function isMaximized(hwnd: bigint): boolean {
171
- return user32.IsZoomed(hwnd);
172
- }
173
-
174
- /**
175
- * Check if a window is in normal state
176
- */
177
- export function isNormal(hwnd: bigint): boolean {
178
- return !user32.IsIconic(hwnd) && !user32.IsZoomed(hwnd);
179
- }
180
-
181
- /**
182
- * Minimize a window
183
- */
184
- export function minimizeWindow(hwnd: bigint): boolean {
185
- return user32.ShowWindow(hwnd, SW_MINIMIZE);
186
- }
187
-
188
- /**
189
- * Maximize a window
190
- */
191
- export function maximizeWindow(hwnd: bigint): boolean {
192
- return user32.ShowWindow(hwnd, SW_MAXIMIZE);
193
- }
194
-
195
- /**
196
- * Restore a window to normal state
197
- */
198
- export function restoreWindow(hwnd: bigint): boolean {
199
- return user32.ShowWindow(hwnd, SW_RESTORE);
200
- }