{"_id":"@agsolutions-at/forcefocus","_rev":"7-40ab38cd1038de74d7341d7f2aec12e8","name":"@agsolutions-at/forcefocus","dist-tags":{"next":"0.0.4","latest":"0.1.0"},"versions":{"0.0.2":{"name":"@agsolutions-at/forcefocus","version":"0.0.2","license":"MIT","_id":"@agsolutions-at/forcefocus@0.0.2","maintainers":[{"name":"ajgassner","email":"hello@agsolutions.at"}],"homepage":"https://github.com/agsolutions-at/forcefocus#readme","bugs":{"url":"https://github.com/agsolutions-at/forcefocus/issues"},"ava":{"timeout":"3m"},"dist":{"shasum":"f759b60a26508fa8764ed54d917c1de00b7c4a5f","tarball":"https://registry.npmjs.org/@agsolutions-at/forcefocus/-/forcefocus-0.0.2.tgz","fileCount":8,"integrity":"sha512-m1J94pgU6iaQRY6lK8wVv8+soowLZKF7PM6sQVXKL0U6TLJhCQt8k3i1wWKDnuWuVtGfVhoHBN2FxOWKKOBaSA==","signatures":[{"sig":"MEYCIQCYbnFN2UMXTfOGYZiIYVfLLOe6DIhoGBqxhCSw08nzUQIhALCYChTM6HUuUay+4+Lc3X5zHgwNkeuhb2zvk7CTUTuH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agsolutions-at%2fforcefocus@0.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":11370},"main":"index.js","napi":{"name":"forcefocus","triples":{"defaults":false,"additional":["aarch64-pc-windows-msvc","x86_64-pc-windows-msvc","i686-pc-windows-msvc"]}},"types":"index.d.ts","engines":{"node":">= 10"},"gitHead":"8e1ccacea53ae1c2777a786e3498fca0beb0a69d","scripts":{"test":"ava","build":"napi build --platform --release","version":"napi version","artifacts":"napi artifacts","universal":"napi universal","build:debug":"napi build --platform","prepublishOnly":"napi prepublish -t npm"},"_npmUser":{"name":"ajgassner","email":"hello@agsolutions.at"},"repository":{"url":"git+https://github.com/agsolutions-at/forcefocus.git"},"_npmVersion":"10.8.2","description":"test","directories":{},"_nodeVersion":"20.19.0","_hasShrinkwrap":false,"packageManager":"yarn@4.9.1","devDependencies":{"ava":"^6.0.1","@napi-rs/cli":"^2.18.4"},"optionalDependencies":{"@agsolutions-at/forcefocus-win32-x64-msvc":"0.0.2","@agsolutions-at/forcefocus-win32-ia32-msvc":"0.0.2","@agsolutions-at/forcefocus-win32-arm64-msvc":"0.0.2"},"_npmOperationalInternal":{"tmp":"tmp/forcefocus_0.0.2_1744889550921_0.8250964323339416","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@agsolutions-at/forcefocus","version":"0.0.4","keywords":["electron","nodejs"],"author":{"name":"agsolutions GmbH"},"license":"MIT","_id":"@agsolutions-at/forcefocus@0.0.4","maintainers":[{"name":"ajgassner","email":"hello@agsolutions.at"}],"homepage":"https://github.com/agsolutions-at/forcefocus#readme","bugs":{"url":"https://github.com/agsolutions-at/forcefocus/issues"},"ava":{"timeout":"3m"},"dist":{"shasum":"62d4c8515aa0722c092d79784133eb267f4bafd0","tarball":"https://registry.npmjs.org/@agsolutions-at/forcefocus/-/forcefocus-0.0.4.tgz","fileCount":8,"integrity":"sha512-xiU9bgibFS0/5nXIq5fJlKYCQ8ud9W82iEK/UrLWTtoKduMWKRI7C/yQrWllgPX9u0lCyi6sywXxyfsDUy+FeA==","signatures":[{"sig":"MEYCIQDEIATDJNqvc3wtsLWI8adriDWHLvbgDXTy1ZpGS1vPyAIhAJYVscZdsx4ZbGQdzvtnOioW7Sg6zgf9vdRfRShmHyB/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agsolutions-at%2fforcefocus@0.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":12728},"main":"index.js","napi":{"name":"forcefocus","triples":{"defaults":false,"additional":["aarch64-pc-windows-msvc","x86_64-pc-windows-msvc","i686-pc-windows-msvc"]}},"types":"index.d.ts","engines":{"node":">= 10"},"gitHead":"dc390fe0076c259088143673f66171466954bd35","scripts":{"test":"ava","build":"napi build --platform --release","version":"napi version","artifacts":"napi artifacts","universal":"napi universal","build:debug":"napi build --platform","prepublishOnly":"napi prepublish -t npm"},"_npmUser":{"name":"ajgassner","email":"hello@agsolutions.at"},"repository":{"url":"git+https://github.com/agsolutions-at/forcefocus.git"},"_npmVersion":"10.8.2","description":"test","directories":{},"_nodeVersion":"20.19.0","_hasShrinkwrap":false,"packageManager":"yarn@4.9.1","readmeFilename":"README.md","devDependencies":{"ava":"^6.0.1","@napi-rs/cli":"^2.18.4"},"optionalDependencies":{"@agsolutions-at/forcefocus-win32-x64-msvc":"0.0.4","@agsolutions-at/forcefocus-win32-ia32-msvc":"0.0.4","@agsolutions-at/forcefocus-win32-arm64-msvc":"0.0.4"},"_npmOperationalInternal":{"tmp":"tmp/forcefocus_0.0.4_1744902317759_0.7837812568918865","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"@agsolutions-at/forcefocus","version":"0.0.6","keywords":["electron","nodejs"],"author":{"name":"agsolutions GmbH"},"license":"MIT","_id":"@agsolutions-at/forcefocus@0.0.6","maintainers":[{"name":"ajgassner","email":"hello@agsolutions.at"}],"homepage":"https://github.com/agsolutions-at/forcefocus#readme","bugs":{"url":"https://github.com/agsolutions-at/forcefocus/issues"},"ava":{"timeout":"3m"},"dist":{"shasum":"9646b11707f9436c6b4f27fd72e6e79fa110a625","tarball":"https://registry.npmjs.org/@agsolutions-at/forcefocus/-/forcefocus-0.0.6.tgz","fileCount":9,"integrity":"sha512-DuVowOG8/W6m1kiofpI0lte2d5+5qFCsAMywvwjOSsCMEnfEIIdi/PnkNiD72s7W6WN8dAHhad6fNmRK1SL/yA==","signatures":[{"sig":"MEQCIDqt1qA9I2uiXcyW8m2/utM10D//rZ9DRVYg+tWK6FoqAiAk/BUWArCdFJy8yVXdlUwcS2aKt4tTI+ECBfiwtVpw/Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agsolutions-at%2fforcefocus@0.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":15962},"main":"index.js","napi":{"name":"forcefocus","triples":{"defaults":false,"additional":["aarch64-pc-windows-msvc","x86_64-pc-windows-msvc","i686-pc-windows-msvc"]}},"types":"index.d.ts","engines":{"node":">= 10"},"gitHead":"063c86485f5fb207fd9a5f01fedd8b2559187496","scripts":{"test":"ava","build":"napi build --platform --release","version":"napi version","artifacts":"napi artifacts","universal":"napi universal","build:debug":"napi build --platform","prepublishOnly":"napi prepublish -t npm"},"_npmUser":{"name":"ajgassner","email":"hello@agsolutions.at"},"repository":{"url":"git+https://github.com/agsolutions-at/forcefocus.git"},"_npmVersion":"10.8.2","description":"`forcefocus` is a modern reimplementation of [robinwassen/forcefocus](https://github.com/robinwassen/forcefocus), featuring prebuilt bindings written in Rust for enhanced performance and reliability. This project provides the same native logic and usage a","directories":{},"_nodeVersion":"20.19.0","_hasShrinkwrap":false,"packageManager":"yarn@4.9.1","devDependencies":{"ava":"^6.0.1","@napi-rs/cli":"^2.18.4"},"optionalDependencies":{"@agsolutions-at/forcefocus-win32-x64-msvc":"0.0.6","@agsolutions-at/forcefocus-win32-ia32-msvc":"0.0.6","@agsolutions-at/forcefocus-win32-arm64-msvc":"0.0.6"},"_npmOperationalInternal":{"tmp":"tmp/forcefocus_0.0.6_1744920848190_0.34412869186668815","host":"s3://npm-registry-packages-npm-production"}},"0.0.8":{"name":"@agsolutions-at/forcefocus","version":"0.0.8","keywords":["electron","nodejs","napi-rs","rust"],"author":{"name":"agsolutions GmbH"},"license":"MIT","_id":"@agsolutions-at/forcefocus@0.0.8","maintainers":[{"name":"ajgassner","email":"hello@agsolutions.at"}],"homepage":"https://github.com/agsolutions-at/forcefocus#readme","bugs":{"url":"https://github.com/agsolutions-at/forcefocus/issues"},"ava":{"timeout":"3m"},"dist":{"shasum":"01b655f08e54ccd04b1ca42dce235fa22e4d2c3c","tarball":"https://registry.npmjs.org/@agsolutions-at/forcefocus/-/forcefocus-0.0.8.tgz","fileCount":9,"integrity":"sha512-oy1pDS78n88TXMKY7Tp7T0OLH43nOfRDOYtyaSCUdtJdsL6FTCIBFW3b9x/KZG0FXiJ5k9+9RrQLt2qaJGjq1g==","signatures":[{"sig":"MEYCIQDqUdwT8H3rWxTskHmaPblBJwEThHFvY6zDrS6UTZdRYQIhANhxTt6253XxXsLffYcLlgZGcs545Y0mtVnxFYdLLk4x","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agsolutions-at%2fforcefocus@0.0.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":15989},"main":"index.js","napi":{"name":"forcefocus","triples":{"defaults":false,"additional":["aarch64-pc-windows-msvc","x86_64-pc-windows-msvc","i686-pc-windows-msvc"]}},"types":"index.d.ts","engines":{"node":">= 10"},"gitHead":"de8646ce88c130ca7ea95e1f0e314470e7b9bb5e","scripts":{"test":"ava","build":"napi build --platform --release","version":"napi version","artifacts":"napi artifacts","universal":"napi universal","build:debug":"napi build --platform","prepublishOnly":"napi prepublish -t npm"},"_npmUser":{"name":"ajgassner","email":"hello@agsolutions.at"},"repository":{"url":"git+https://github.com/agsolutions-at/forcefocus.git"},"_npmVersion":"10.8.2","description":"`forcefocus` is a modern reimplementation of [robinwassen/forcefocus](https://github.com/robinwassen/forcefocus), featuring prebuilt bindings written in Rust for enhanced performance and reliability. This project provides the same native logic and usage a","directories":{},"_nodeVersion":"20.19.0","_hasShrinkwrap":false,"packageManager":"yarn@4.9.1","devDependencies":{"ava":"^6.0.1","@napi-rs/cli":"^2.18.4"},"optionalDependencies":{"@agsolutions-at/forcefocus-win32-x64-msvc":"0.0.8","@agsolutions-at/forcefocus-win32-ia32-msvc":"0.0.8","@agsolutions-at/forcefocus-win32-arm64-msvc":"0.0.8"},"_npmOperationalInternal":{"tmp":"tmp/forcefocus_0.0.8_1744921856841_0.4588815777726438","host":"s3://npm-registry-packages-npm-production"}},"0.0.9":{"name":"@agsolutions-at/forcefocus","version":"0.0.9","keywords":["electron","nodejs","napi-rs","rust"],"author":{"name":"agsolutions GmbH"},"license":"MIT","_id":"@agsolutions-at/forcefocus@0.0.9","maintainers":[{"name":"ajgassner","email":"hello@agsolutions.at"}],"homepage":"https://github.com/agsolutions-at/forcefocus#readme","bugs":{"url":"https://github.com/agsolutions-at/forcefocus/issues"},"ava":{"timeout":"3m"},"dist":{"shasum":"407799f5266ef5fb180066fa7029a2c7df616479","tarball":"https://registry.npmjs.org/@agsolutions-at/forcefocus/-/forcefocus-0.0.9.tgz","fileCount":10,"integrity":"sha512-qx5zQJp/zCvsis438cLF4jVvoQakPtjZ/aQ0zpCS0taCKm5GaO3yKcTy1JoPgdft9FGgJwhk2Omolv4KAGUBww==","signatures":[{"sig":"MEYCIQDmAE+5pS/yxmEnVdjU7O1w8QvTQUC73sDCtLloEQhuGAIhAK+ksWdt6+mh7FgYCYX/bjhO2dNoDmv3JJEVFGjx4PPW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agsolutions-at%2fforcefocus@0.0.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":20184},"main":"index.js","napi":{"name":"forcefocus","triples":{"defaults":false,"additional":["aarch64-pc-windows-msvc","x86_64-pc-windows-msvc","i686-pc-windows-msvc"]}},"types":"index.d.ts","engines":{"node":">= 10"},"gitHead":"e1b794e2dadc87b12d4b69043b8becf66edf10d3","scripts":{"test":"ava","build":"napi build --platform --release","version":"napi version","artifacts":"napi artifacts","universal":"napi universal","build:debug":"napi build --platform","prepublishOnly":"napi prepublish -t npm"},"_npmUser":{"name":"ajgassner","email":"hello@agsolutions.at"},"repository":{"url":"git+https://github.com/agsolutions-at/forcefocus.git"},"_npmVersion":"10.8.2","description":"[![npm version](https://img.shields.io/npm/v/@agsolutions-at/forcefocus.svg)](https://www.npmjs.com/package/@agsolutions-at/forcefocus) [![npm downloads](https://img.shields.io/npm/dm/@agsolutions-at/forcefocus.svg)](https://www.npmjs.com/package/@agsolut","directories":{},"_nodeVersion":"20.19.0","_hasShrinkwrap":false,"packageManager":"yarn@4.9.1","devDependencies":{"ava":"^6.0.1","@napi-rs/cli":"^2.18.4"},"optionalDependencies":{"@agsolutions-at/forcefocus-win32-x64-msvc":"0.0.9","@agsolutions-at/forcefocus-win32-ia32-msvc":"0.0.9","@agsolutions-at/forcefocus-win32-arm64-msvc":"0.0.9"},"_npmOperationalInternal":{"tmp":"tmp/forcefocus_0.0.9_1745350334402_0.23281798399880005","host":"s3://npm-registry-packages-npm-production"}},"0.0.10":{"name":"@agsolutions-at/forcefocus","version":"0.0.10","keywords":["electron","nodejs","napi-rs","rust"],"author":{"name":"agsolutions GmbH"},"license":"MIT","_id":"@agsolutions-at/forcefocus@0.0.10","maintainers":[{"name":"ajgassner","email":"hello@agsolutions.at"}],"homepage":"https://github.com/agsolutions-at/forcefocus#readme","bugs":{"url":"https://github.com/agsolutions-at/forcefocus/issues"},"ava":{"timeout":"3m"},"dist":{"shasum":"7a9d7c3ec22541cdd24a8f4ad9728f72438f37f3","tarball":"https://registry.npmjs.org/@agsolutions-at/forcefocus/-/forcefocus-0.0.10.tgz","fileCount":10,"integrity":"sha512-1wflMR5EQ8f8KLw8VoHCdqZxlm2hPci8Mgg04HrU6gb6nl/YOtkVLwBy4QcDAGNTBsmve3MjbY9PCjW9mCHH5g==","signatures":[{"sig":"MEUCIAeezaqwWnMFLzP7Ss4njO9AccFeNlYWM6M3HBuCVvTSAiEA/JlWaGzXGjymzXljwJYz57bk0owBnMEXqIZHfetamns=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agsolutions-at%2fforcefocus@0.0.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":20188},"main":"index.js","napi":{"name":"forcefocus","triples":{"defaults":false,"additional":["aarch64-pc-windows-msvc","x86_64-pc-windows-msvc","i686-pc-windows-msvc"]}},"types":"index.d.ts","engines":{"node":">= 10"},"gitHead":"71dd689939d5e7a3055839c16d29bccffbcfb7d9","scripts":{"test":"ava","build":"napi build --platform --release","version":"napi version","artifacts":"napi artifacts","universal":"napi universal","build:debug":"napi build --platform","prepublishOnly":"napi prepublish -t npm"},"_npmUser":{"name":"ajgassner","email":"hello@agsolutions.at"},"repository":{"url":"git+https://github.com/agsolutions-at/forcefocus.git"},"_npmVersion":"10.8.2","description":"[![npm version](https://img.shields.io/npm/v/@agsolutions-at/forcefocus.svg)](https://www.npmjs.com/package/@agsolutions-at/forcefocus) [![npm downloads](https://img.shields.io/npm/dm/@agsolutions-at/forcefocus.svg)](https://www.npmjs.com/package/@agsolut","directories":{},"_nodeVersion":"20.19.0","_hasShrinkwrap":false,"packageManager":"yarn@4.9.1","devDependencies":{"ava":"^6.0.1","@napi-rs/cli":"^2.18.4"},"optionalDependencies":{"@agsolutions-at/forcefocus-win32-x64-msvc":"0.0.10","@agsolutions-at/forcefocus-win32-ia32-msvc":"0.0.10","@agsolutions-at/forcefocus-win32-arm64-msvc":"0.0.10"},"_npmOperationalInternal":{"tmp":"tmp/forcefocus_0.0.10_1745350772622_0.8138132940224378","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@agsolutions-at/forcefocus","version":"0.1.0","main":"index.js","types":"index.d.ts","author":{"name":"agsolutions GmbH"},"license":"MIT","repository":{"url":"git+https://github.com/agsolutions-at/forcefocus.git"},"keywords":["electron","nodejs","napi-rs","rust"],"napi":{"binaryName":"forcefocus","targets":["aarch64-pc-windows-msvc","x86_64-pc-windows-msvc","i686-pc-windows-msvc"]},"devDependencies":{"@napi-rs/cli":"^3.6.2","ava":"^8.0.0"},"ava":{"timeout":"3m"},"engines":{"node":">= 12.17.0"},"publishConfig":{"registry":"https://registry.npmjs.org/","access":"public"},"scripts":{"artifacts":"napi artifacts","build":"napi build --platform --release","build:debug":"napi build --platform","prepublishOnly":"napi pre-publish --gh-release -t npm","test":"ava","universal":"napi universalize","version":"napi version"},"packageManager":"yarn@4.14.1","optionalDependencies":{"@agsolutions-at/forcefocus-win32-arm64-msvc":"0.1.0","@agsolutions-at/forcefocus-win32-x64-msvc":"0.1.0","@agsolutions-at/forcefocus-win32-ia32-msvc":"0.1.0"},"gitHead":"e81e26280d9da0141d66a506db3f9f007b121588","_id":"@agsolutions-at/forcefocus@0.1.0","description":"[![npm version](https://img.shields.io/npm/v/@agsolutions-at/forcefocus.svg)](https://www.npmjs.com/package/@agsolutions-at/forcefocus) [![npm downloads](https://img.shields.io/npm/dm/@agsolutions-at/forcefocus.svg)](https://www.npmjs.com/package/@agsolut","bugs":{"url":"https://github.com/agsolutions-at/forcefocus/issues"},"homepage":"https://github.com/agsolutions-at/forcefocus#readme","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-vvoNd0TkHziTuKO2gJaluDhtOFKdeBidvlo+AK2+aK+3XNKD7dT1E98dILIaY1mr80Rw6kzxs8iqOYzvp4HJGA==","shasum":"a5aa97729549054314e6d0db63821d13578ef33e","tarball":"https://registry.npmjs.org/@agsolutions-at/forcefocus/-/forcefocus-0.1.0.tgz","fileCount":6,"unpackedSize":34500,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agsolutions-at%2fforcefocus@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBj6eJoBxDw2d/GTw7Cz0dcVxi5PPeacUO1YsYAqpur7AiBLZvfhxoXq4QyiJ/BLyGnVcINs7IcIFdz9YnkunAoiLw=="}]},"_npmUser":{"name":"ajgassner","email":"hello@agsolutions.at"},"directories":{},"maintainers":[{"name":"ajgassner","email":"hello@agsolutions.at"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/forcefocus_0.1.0_1778280297823_0.15501279993193884"},"_hasShrinkwrap":false}},"time":{"created":"2025-04-17T11:32:30.862Z","modified":"2026-05-08T22:44:58.334Z","0.0.2":"2025-04-17T11:32:31.099Z","0.0.4":"2025-04-17T15:05:17.926Z","0.0.6":"2025-04-17T20:14:08.358Z","0.0.8":"2025-04-17T20:30:57.037Z","0.0.9":"2025-04-22T19:32:14.588Z","0.0.10":"2025-04-22T19:39:32.830Z","0.1.0":"2026-05-08T22:44:57.968Z"},"bugs":{"url":"https://github.com/agsolutions-at/forcefocus/issues"},"author":{"name":"agsolutions GmbH"},"license":"MIT","homepage":"https://github.com/agsolutions-at/forcefocus#readme","keywords":["electron","nodejs","napi-rs","rust"],"repository":{"url":"git+https://github.com/agsolutions-at/forcefocus.git"},"description":"[![npm version](https://img.shields.io/npm/v/@agsolutions-at/forcefocus.svg)](https://www.npmjs.com/package/@agsolutions-at/forcefocus) [![npm downloads](https://img.shields.io/npm/dm/@agsolutions-at/forcefocus.svg)](https://www.npmjs.com/package/@agsolut","maintainers":[{"name":"ajgassner","email":"hello@agsolutions.at"}],"readme":"# forcefocus\n\n[![npm version](https://img.shields.io/npm/v/@agsolutions-at/forcefocus.svg)](https://www.npmjs.com/package/@agsolutions-at/forcefocus)\n[![npm downloads](https://img.shields.io/npm/dm/@agsolutions-at/forcefocus.svg)](https://www.npmjs.com/package/@agsolutions-at/forcefocus)\n[![license](https://img.shields.io/npm/l/@agsolutions-at/forcefocus.svg)](./LICENSE)\n[![node](https://img.shields.io/node/v/@agsolutions-at/forcefocus)](https://nodejs.org)\n[![platforms](https://img.shields.io/badge/platforms-Windows-blue)](#)\n[![CI](https://github.com/agsolutions-at/forcefocus/actions/workflows/CI.yml/badge.svg)](https://github.com/agsolutions-at/forcefocus/actions/workflows/CI.yml)\n\n`forcefocus` is a modern reimplementation of [robinwassen/forcefocus](https://github.com/robinwassen/forcefocus), featuring prebuilt bindings written\nin Rust for enhanced performance and reliability. This project provides the same native logic and usage as the original `forcefocus` tool, enabling\nyou to programmatically bring a specific window to the foreground on Windows.\n\n## Features\n\n- Heavily inspired by the original `forcefocus` project.\n- Prebuilt Rust bindings.\n- Easy-to-use Node.js interface for integrative purposes.\n- No need to build from source when used in an Electron project anymore.\n\n## Usage\n\nThis package provides a simple API to focus a window by its handle using Node.js. For example:\n\n```typescript\nimport process from 'node:process';\nimport { BrowserWindow } from 'electron';\n\nconst isWindows = process.platform === 'win32'\n\nasync function bringWindowToFront(window: BrowserWindow) {\n   if (isWindows) {\n      const { focusWindow } = await import('@agsolutions-at/forcefocus')\n      focusWindow(window.getNativeWindowHandle())\n      return\n   }\n\n   // other platforms\n   window.focus()\n}\n```\n\nThe primary function `focusWindow` takes a `Buffer` containing the window handle and brings the corresponding window to the foreground.\nThe lib works on Windows only, so please make sure you don't import it on other platforms.\n\n### Installation\n\nTo add this package to your Node.js project, use a package manager of your choice:\n\n```bash\n# npm\nnpm install @agsolutions-at/forcefocus\n\n# yarn\nyarn add @agsolutions-at/forcefocus\n\n# pnpm\npnpm add @agsolutions-at/forcefocus\n```\n\n### Building from Source\n\nIf you prefer to build this package from source, follow these steps:\n\n1. Clone the repository:\n   ```bash\n   git clone https://github.com/agsolutions-at/forcefocus.git\n   cd forcefocus\n   ```\n2. Install dependencies:\n   ```bash\n   yarn install\n   ```\n3. Build the project:\n   ```bash\n   yarn build\n   ```\n\n## Using `electron-builder` to bundle the platform-specific native module\n\nWhen building an Electron app, you may need native modules that are specifically compiled for your target operating system and architecture (like\ngetting the right key to fit the right lock). The following script helps make sure the correct .node binaries are downloaded just before packaging the\napp using electron-builder.\n\n```json\n// package.json\n{\n  ...\n  \"build\": {\n    \"beforePack\": \"./beforePack.js\",\n    \"files\": [\n      ...\n      \"!**/node_modules/@agsolutions-at/forcefocus-*/**\"\n    ]\n  },\n  ...\n}\n```\n\nDefine a `beforePack` hook. Do not include optional dependencies of your build platform.\n\n```typescript\n// beforePack.js\nimport path from 'node:path';\nimport https from 'node:https';\nimport fs from 'node:fs';\nimport forceFocusPackage from './app/node_modules/@agsolutions-at/forcefocus/package.json' with { type: 'json' };\nimport { fileURLToPath } from 'node:url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst downloadFile = (url, dest, cb) => {\n   https\n   .get(url, res => {\n      // If redirect\n      if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {\n         return downloadFile(res.headers.location, dest, cb); // follow redirect\n      }\n\n      const fileStream = fs.createWriteStream(dest);\n      res.pipe(fileStream);\n\n      fileStream.on('finish', () => {\n         fileStream.close(cb); // call callback on finish\n      });\n\n      res.on('error', err => {\n         fs.unlink(dest, () => {});\n         cb(err.message);\n      });\n   })\n   .on('error', err => {\n      cb(err.message);\n   });\n};\n\nconst beforePack = context => {\n   const { electronPlatformName, arch } = context;\n\n   let archName;\n   switch (arch) {\n      case 0:\n         archName = 'ia32';\n         break;\n      case 1:\n         archName = 'x64';\n         break;\n      case 2:\n         archName = 'armv7l';\n         break;\n      case 3:\n         archName = 'arm64';\n         break;\n      case 4:\n         archName = 'universal';\n         break;\n      default:\n         throw Error('Unknown arch');\n   }\n\n   if (electronPlatformName === 'win32') {\n      const downloadUrl = `https://github.com/agsolutions-at/forcefocus/releases/download/v${forceFocusPackage.version}/forcefocus.win32-${archName}-msvc.node`;\n      const nativeModulePath = path.join(\n              __dirname,\n              'app',\n              'node_modules',\n              '@agsolutions-at',\n              'forcefocus',\n              `forcefocus.win32-${archName}-msvc.node`\n      );\n      downloadFile(downloadUrl, nativeModulePath, err => {\n         if (err) {\n            console.error('Download error:', err);\n            process.exit(1);\n         } else {\n            console.log('Download forcefocus completed');\n         }\n      });\n   }\n};\n\nexport default beforePack;\n```\n\n`beforePack.js`: before your app gets packaged, it sneaks in and places the correct native modules on stage based on the OS and architecture you're\ntargeting. It detects whether you're building for Windows or macOS, figures out the architecture (x64, arm64, etc.), downloads the correct version\nof native .node files from GitHub releases and saves them into the appropriate module folders.\n\n## Contributing\n\nContributions are welcomed.\nPlease feel free to open issues or pull requests on the GitHub repository.\n\n## License\n\nThe project is licensed under the MIT license.\n","readmeFilename":"README.md"}