{"id":13977378,"name":"sapgui.wrapper","ecosystem":"nuget","description":"A strongly-typed .NET wrapper for the SAP GUI Scripting API (sapfewse.ocx). Enables C# / VB.NET automation of SAP GUI - the same way VBA does it natively - for use in UiPath, console apps, or any .NET project.","homepage":"https://github.com/alexrivax/SapGui.Wrapper","licenses":"MIT","normalized_licenses":["MIT"],"repository_url":"https://github.com/alexrivax/SapGui.Wrapper","keywords_array":["SAP","SAPGUI","SAP-Scripting","COM-Interop","UiPath","Automation","RPA"],"namespace":null,"versions_count":8,"first_release_published_at":"2026-03-03T18:09:26.137Z","latest_release_published_at":"2026-04-07T09:10:18.297Z","latest_release_number":"1.1.0","last_synced_at":"2026-07-12T15:59:52.988Z","created_at":"2026-03-03T18:15:31.417Z","updated_at":"2026-07-12T21:30:14.159Z","registry_url":"https://www.nuget.org/packages/sapgui.wrapper/","install_command":"Install-Package sapgui.wrapper","documentation_url":null,"metadata":{"copyright":"Copyright © 2026 alexrivax","license_info":{"type":"expression","text":"MIT","version":null},"license_url":"https://licenses.nuget.org/MIT","require_license_acceptance":false,"icon":"icon.png","readme":"README.md","repository":{"type":"git","url":"https://github.com/alexrivax/SapGui.Wrapper","branch":"refs/heads/main","commit":"511e1074d5d4f2d3dff9221d2218a9768feccaa9"},"development_dependency":false,"serviceable":false,"framework_assemblies":[],"package_types":[],"release_notes":"# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/) and this project adheres to [Semantic Versioning](https://semver.org/).\n\n## [1.1.0] – 2026-04-03 — `SapGui.Wrapper.Mcp` (new package)\n\n### New package\n\n- **`SapGui.Wrapper.Mcp` 1.1.0** — MCP stdio server (`sapgui-mcp` dotnet tool) that exposes SAP GUI automation as 18 typed MCP tools consumable by any MCP-capable host (Claude Desktop, VS Code Copilot Agent, Cursor, and others). Includes a screen observation layer (typed snapshots, JSON context) and semantic action façade (fuzzy field/button resolution via label) bundled as an internal dependency — no separate package needed. All SAP COM calls are marshalled onto a dedicated STA thread. Includes built-in guardrails: 12 dangerous transactions blocked by default and a `ReadOnlyMode` flag that restricts the server to observation-only tools.\n\n### Infrastructure\n\n- `Directory.Build.props` — single source of truth for `SharedVersion`, shared NuGet metadata (Authors, License, URLs), and compiler settings (`LangVersion latest`, `Nullable enable`, `ImplicitUsings enable`, `Deterministic true`) across all projects.\n- CI (`ci.yml`) — dry-run `dotnet pack` for both packages on every PR.\n- Publish (`publish.yml`) — reads version from `Directory.Build.props`, builds, packs, and pushes both packages on every push to `main`.\n\n## [1.0.0] – 2026-03-11\n\n### First stable release\n\nSapGui.Wrapper is now considered production-ready for general use. All core APIs, element wrappers, events, retry/wait mechanisms, logging, health checks, and SSO support have been validated through extensive integration testing and iterative refinement across the 0.x series.\n\n### Breaking changes\n\n- **`GuiTable.VerticalScrollbarPosition` removed** — this property was deprecated in 0.5.0 in favour of `FirstVisibleRow`. Use `FirstVisibleRow` instead.\n- **`GuiComboBox.SetKeyAndFireEvent` removed** (since 0.8.4) — use `cb.Key = value` instead.\n\n### Summary of capabilities (since 0.0.0)\n\n- **20+ typed element wrappers** — `GuiTextField`, `GuiButton`, `GuiGridView`, `GuiTable`, `GuiTree`, `GuiComboBox`, `GuiCheckBox`, `GuiRadioButton`, `GuiTabStrip`, `GuiToolbar`, `GuiMenu`, `GuiStatusbar`, `GuiMessageWindow`, `GuiCalendar`, `GuiHTMLViewer`, `GuiScrollContainer`, `GuiUserArea`, `GuiShell`, `GuiLabel`, and more.\n- **Session management** — `SapGuiClient.Attach()`, `LaunchWithSso()`, `HealthCheck()`, `EnsureHealthy()`, `GetSession()`, multi-connection/multi-session support.\n- **Resilient automation** — `WaitReady`, `WaitForReadyState`, `ElementExists`, `WaitUntilHidden`, `WithRetry` (retries on `SapComponentNotFoundException` and `TimeoutException`).\n- **COM event sink** — `StartMonitoring()` connects a true COM event sink (with polling fallback): `StartRequest`, `EndRequest`, `Change`, `Destroy`, `AbapRuntimeError`.\n- **Logging** — `ILogger` and `SapLogAction` delegate overloads, zero overhead when unconfigured.\n- **Post-login popup handling** — `DismissPostLoginPopups` handles multiple-logon dialogs, license warnings, system messages.\n- **NuGet hardening** — deterministic builds, SourceLink, SBOM generation, package signing script.\n- **COM lifecycle safety** — all intermediate COM objects released via `try/finally` + `Marshal.ReleaseComObject`; `SapGuiClient` and `GuiSession` are `IDisposable`.\n- **GitHub Pages documentation** — full API reference (auto-generated from XML docs via DocFX), Getting Started, Common Patterns, Logging, Resilient Automation, Health Check, Session Events, Best Practices, Troubleshooting, and FAQ articles published at `https://alexrivax.github.io/SapGui.Wrapper`.\n\n## [0.9.2] – 2026-03-10\n\n### Changed\n\n- **`SapGuiClient.LaunchWithSso` — new `reuseExistingSession` parameter** — Instead of attempting to dismiss the SAP Logon \"License information for multiple logons\" dialog programmatically (which proved unreliable because the dialog is a native Win32 window owned by `saplogon.exe`, outside the SAP scripting API), `LaunchWithSso` now detects an existing open session for the requested system **before** calling `OpenConnection`, preventing the dialog from ever appearing. Pass `reuseExistingSession: true` to reuse the existing session; omit it (default `false`) to receive a clear `InvalidOperationException` with instructions.\n\n### Removed\n\n- All Win32 dialog-dismissal code (`EnumWindows`, `keybd_event`, `SetForegroundWindow`, background watcher task) introduced in 0.9.1 — replaced by the pre-flight session check above.\n\n## [0.9.1] – 2026-03-10\n\n### Bug fix\n\n- **`DismissPostLoginPopups` now handles the \"License information for multiple logons\" dialog** — When a user is already logged on to the same SAP system, SAP shows a radio-button dialog titled _\"License information for multiple logons\"_ before the standard session-management popup. The dialog was not matched by the existing heuristics and was left untouched, blocking automation. A dedicated check is now inserted before the generic `MULTIPLE LOGON` branch: when the title contains `\"License information for multiple logons\"`, `DismissPostLoginPopups` presses Enter (VKey 0), accepting the default option _\"Continue without ending other logon\"_ — the non-destructive, license-safe choice.\n\n## [0.9.0] – 2026-03-09\n\n### Added\n\n- **`SapGuiClient.HealthCheck()`** — static, never-throws pre-flight method that returns a `HealthCheckResult` record (`IsHealthy`, `Findings`, `FailureSummary`). Runs five ordered checks: SAP GUI process is running → scripting API accessible via ROT → at least one connection exists → at least one session exists → session info (user / system / client) is readable. Each finding is prefixed `OK:`, `WARN:`, or `FAIL:` for easy filtering. The temporary COM reference obtained during the check is released in a `finally` block.\n- **`SapGuiClient.EnsureHealthy()`** — convenience throwing variant: calls `HealthCheck()` and raises `InvalidOperationException` with all `FAIL:` lines when any check fails. Designed for fail-fast workflows.\n- **`HealthCheckResult`** record — `IsHealthy` (`bool`), `Findings` (`IReadOnlyList\u003cstring\u003e`), `FailureSummary` (FAIL lines joined by newline), `ToString()` (all findings).\n- **`Polyfills.cs`** — internal `System.Runtime.CompilerServices.IsExternalInit` shim (guarded by `#if !NET5_0_OR_GREATER`) enabling C# 9 `record` types on net461 with zero runtime cost.\n\n### NuGet / build hardening\n\n- **Transitive dependencies pinned** — `Microsoft.Build.Tasks.Git` and `Microsoft.SourceLink.Common` are now explicitly listed at `8.0.0` in the `.csproj`, matching the already-present `Microsoft.SourceLink.GitHub 8.0.0`. This produces a fully deterministic, auditable NuGet dependency graph required by enterprise artifact repositories (Artifactory, Azure Artifacts with policy enforcement).\n- **SBOM on every pack** — `GenerateSbom` AfterPack MSBuild target invokes `dotnet CycloneDX` and writes `SapGui.Wrapper-{version}-sbom.cdx.json` alongside the `.nupkg`. The tool is pinned to `cyclonedx 3.0.8` in `.config/dotnet-tools.json`. Run `dotnet tool restore` once before the first pack.\n- **Package signing script** — `scripts/New-SigningCert.ps1` creates a self-signed code-signing certificate (RSA-3072, SHA-256, 5-year validity), exports it as a PFX, and signs all `.nupkg` files in `nupkg/` via `dotnet nuget sign` with a DigiCert timestamp. `*.pfx` and `*.p12` are now excluded by `.gitignore`.\n\n## [0.8.7] – 2026-03-09\n\n### Added\n\n- **`RetryPolicy`** — new class returned by `session.WithRetry(maxAttempts, delayMs)`. Call `.Run(action)` or `.Run\u003cT\u003e(func)` to execute an operation with automatic retries on `SapComponentNotFoundException` (slow screen loads) and `TimeoutException` (session still busy). `SapGuiNotFoundException` is never retried — it is a fatal setup error.\n- **`GuiSession.WithRetry(maxAttempts, delayMs)`** — fluent entry point that creates a `RetryPolicy` scoped to the current session.\n- **`GuiSession.WaitForReadyState(timeoutMs, pollMs, settleMs)`** — more reliable alternative to `WaitReady`. After the busy flag clears it waits an additional settle period, then verifies the main window COM object is still accessible. Catches the brief second busy pulse that `WaitReady` can miss during screen transitions.\n- **`GuiSession.ElementExists(id, timeoutMs, pollMs)`** — polls until a component ID is accessible or the timeout elapses. Returns `bool`. Use instead of a try/catch around `FindById` when you need an explicit wait.\n- **`GuiSession.WaitUntilHidden(id, timeoutMs, pollMs)`** — polls until a component ID is no longer accessible. Returns `bool`. Use to wait out loading spinners or processing dialogs.\n\n## [0.8.6] – 2026-03-09\n\n### Bug fixes\n\n- **`GuiTable.ColumnCount` always returned 0** — `GuiTableControl` exposes columns via a `Columns` collection, not a flat `ColumnCount` integer property. `GetInt(\"ColumnCount\")` silently caught `DISP_E_UNKNOWNNAME` and returned 0. Fixed to read `Columns.Count` via the collection object.\n- **`GuiTable.FirstVisibleRow` always returned 0 / `ScrollToRow` threw `DISP_E_UNKNOWNNAME`** — Both used dotted property paths (`\"VerticalScrollbar.Position\"`) passed to `InvokeMember`, which does not resolve nested COM objects. Fixed to retrieve the `VerticalScrollbar` object first, then get/set `Position` on it.\n- **`GuiTable.GetCellValue` always returned empty string** — `GetCellRaw` was navigating `Rows.Item(row).Item(col)`, which does not work on `GuiTableControl`. Fixed to call `GetCell(row, col)` directly on the table COM object.\n- **`GuiTable.GetVisibleRows` returned all rows instead of visible rows** — Loop iterated `RowCount` (total) starting at index 0. SAP only populates COM cells for the currently visible viewport; off-screen rows always return empty values. Fixed to iterate `VisibleRowCount` rows beginning at `FirstVisibleRow`.\n\n## [0.8.5] – 2026-03-09\n\n### Bug fix\n\n- **`session.Table()` failed with `GuiTableControl` type** — Some SAP systems return `\"GuiTableControl\"` from the COM `Type` property instead of `\"GuiTable\"` for the same classic ABAP table control. `WrapComponent` now maps both `GuiTable` and `GuiTableControl` to `GuiTable`, so `session.Table(id)` works regardless of which type string the system reports.\n\n## [0.8.4] – 2026-03-09\n\n### Breaking change\n\n- **`GuiComboBox.SetKeyAndFireEvent` removed** — SAP GUI does not expose `FireSelectEvent` on `GuiComboBox`; the method was equivalent to setting `Key` directly. Use `cb.Key = value` followed by `session.WaitReady()` or `session.SendVKey(0)` if field-level PAI validation is needed.\n\n## [0.8.3] – 2026-03-09\n\n### Bug fix\n\n- **`GuiMainWindow.IsMaximized` always returned `false`** — The SAP COM `IsMaximized` property is not consistently updated after `Maximize()` / `Restore()` across SAP GUI versions. Replaced the COM property read with a Win32 `IsZoomed(HWND)` P/Invoke call, using the HWND already exposed by SAP's `GuiFrameWindow.Handle`. Also added `GuiMainWindow.Handle` (`IntPtr`) as a new public property.\n\n## [0.8.2] – 2026-03-09\n\n### Bug fixes\n\n- **`GetBool` silent VARIANT_BOOL cast failure** — `GuiComponent.GetBool` was casting the COM return value with `(bool)` directly. SAP's COM layer returns `VARIANT_BOOL` as a boxed `short` (-1 = true, 0 = false); the cast threw `InvalidCastException`, which the `catch` swallowed and returned `false`. Changed to `Convert.ToBoolean(val)`, which handles `bool`, `short`, and `int` correctly. This was a silent bug affecting every boolean property across the wrapper: `IsMaximized`, `IsBusy`, `IsReadOnly`, `IsRequired`, `IsOField`, `IsModified`, `Changeable`, `DisabledByServer`, `ShowKey`, `IsDialog`, and all `GetBool` call sites.\n\n### GuiSession — `StartTransaction` documentation\n\n- Expanded XML doc on `StartTransaction(tCode)` to document the `/n` prefix requirement when calling from inside an existing transaction (`\"/nSE16\"`), the `/o` prefix to open in a new session, and the difference from bare code (only reliable from Easy Access menu).\n\n### UiPath Studio project (UiPathTests)\n\n- `SapGui.Wrapper.Tests/UiPathTests/` is now a standalone **UiPath Studio 2023.10+ project**: added `project.json` (NuGet dependencies, net6.0-windows target) and `Main.xaml` (sequence that calls all 14 tests via `InvokeWorkflowFile`).\n- All 14 coded workflow files updated: unified namespace `SapGuiWrapperTests`, added all missing `using` directives (`System`, `System.Collections.Generic`, `System.Linq`, `System.IO`, `System.Threading`, `UiPath.Core`), removed unused UiPath package imports.\n- **Test 01** — `GuiConnection.Description` → `GuiConnection.Host` (property was renamed); `application.ActiveSession` wrapped in try/catch with `session.MainWindow().SetFocus()` before the call to handle OS-focus dependency.\n- **Test 03** — `StartTransaction(\"SE16\")` → `StartTransaction(\"/nSE16\")` so navigation works when already inside another transaction.\n- **Test 11** — `GuiMenubar.GetChildren()` does not exist; replaced with index-based loop using `session.Menu(\"wnd[0]/mbar/menu[{i}]\")` to retrieve top-level `GuiMenu` items.\n- `SapGui.Wrapper.Tests.csproj` — added `\u003cCompile Remove=\"UiPathTests\\**\\*.cs\" /\u003e` to exclude UiPath files from the C# build.\n\n## [0.8.1] – 2026-03-07\n\n### Security — COM lifecycle hardening\n\n- `SapRot.GetGuiApplication()` now releases all intermediate COM objects (`rotWrapper`, `sapGuiRaw`, `IRunningObjectTable`, per-iteration `IBindCtx`) via `try/finally` + `Marshal.ReleaseComObject`. No COM references leak after `Attach()` completes.\n- `SapGuiClient.Dispose()` now explicitly calls `Marshal.ReleaseComObject(Application.RawObject)` instead of relying on the GC finalizer, returning the COM reference to SAP GUI immediately.\n- `GuiSession` now implements `IDisposable`. `Dispose()` calls `StopMonitoring()` first (disconnects COM event sinks and stops any polling thread) then releases the session COM RCW. Safe to use in `using` blocks.\n\n### SapGuiClient — new `LaunchWithSso` factory\n\n- `SapGuiClient.LaunchWithSso(systemDescription, connectionTimeoutMs)` — starts `saplogon.exe` if it is not already running, waits for SAP GUI to register in the Windows ROT, opens the connection by SAP Logon Pad entry name (SSO-configured systems complete without a credential dialog), and polls until a non-busy session is available before returning. Throws `SapGuiNotFoundException`, `InvalidOperationException`, or `TimeoutException` on failure — never silently succeeds with an unusable session.\n\n### GuiSession — new `DismissPostLoginPopups`\n\n- `DismissPostLoginPopups(maxPopups, timeoutMs)` — automatically dismisses post-SSO / post-login dialogs: \"User already logged on / Multiple Logon\" (clicks **Continue** to keep both sessions alive), license expiration warnings, system message banners, and any single-button information dialog. Unrecognised multi-button dialogs are left untouched. Returns the count of dismissed popups.\n\n## [0.8.0]\n\n### GuiSession — COM event sink (architectural improvement)\n\n- `StartMonitoring()` now first tries to connect a true COM event sink to the SAP session via `IConnectionPointContainer::EnumConnectionPoints` / `IConnectionPoint::Advise`. If the COM sink connects successfully, all five SAP session events are driven by the native SAP COM source — no polling thread is started.\n- Falls back automatically to the previous polling-based monitor when the COM object does not support connection points (e.g. older SAP GUI versions).\n- `SessionChangeEventArgs.FunctionCode` is now populated (e.g. `\"BACK\"`, `\"EXEC\"`) when the COM event sink is active. It remains empty in the polling fallback.\n\n### GuiSession — new `StartRequest` / `EndRequest` events\n\n- Added `StartRequest` event (`StartRequestEventArgs`: `Text`) — fires at the beginning of a server round-trip. When using the COM sink this is a true SAP event; in the polling fallback it fires when `IsBusy` first becomes `true`.\n- Added `EndRequest` event (`EndRequestEventArgs`: `Text`, `FunctionCode`, `MessageType`) — fires at the end of a server round-trip, before `Change`. Provides a precise `WaitReady` alternative when combined with `StartMonitoring()`.\n\n### Internal\n\n- Added `Com/ComConnectionPoint.cs` — declares `IConnectionPoint`, `IConnectionPointContainer`, `IEnumConnectionPoints` COM interfaces (standard OLE GUIDs; not present in .NET 6+ BCL).\n- Added `Com/GuiSessionComSink.cs` — `[ComVisible]` `IReflect`-based dispatch sink. Routes both name-based and DISPID-based SAP event calls to the correct .NET event raisers.\n\n## [0.7.0]\n\n### GuiScrollContainer (new wrapper)\n\n- Added `GuiScrollContainer` typed wrapper for SAP GUI scroll container controls.\n- `VerticalScrollbar` and `HorizontalScrollbar` properties return a `GuiScrollbar` object exposing `Position` (read/write), `Minimum`, `Maximum`, and `PageSize`.\n- `ScrollToTop()` convenience method sets the vertical scroll position to its minimum.\n- `session.ScrollContainer(id)` typed finder added to `GuiSession`.\n\n### GuiUserArea (new wrapper)\n\n- Added `GuiUserArea` typed wrapper for the dynpro content area (typically `wnd[0]/usr`).\n- `FindById(relativeId)` and `FindById\u003cT\u003e(relativeId)` allow child lookup with short relative IDs instead of fully qualified paths.\n- `session.UserArea(id)` typed finder added to `GuiSession` (defaults to `\"wnd[0]/usr\"`).\n\n### GuiCalendar (new wrapper)\n\n- Added `GuiCalendar` typed wrapper for SAP GUI calendar controls.\n- `FocusedDate` property returns the focused date as a nullable `DateTime`.\n- `SetDate(DateTime)` — sets the focused/selected date.\n- `GetSelectedDate()` — returns the currently selected date.\n- `session.Calendar(id)` typed finder added to `GuiSession`.\n\n### GuiHTMLViewer (new wrapper)\n\n- Added `GuiHTMLViewer` typed wrapper for embedded HTML viewer controls.\n- `BrowserHandle` — Win32 handle of the embedded browser control.\n- `FireSapEvent(eventName, param1, param2)` — fires a named SAP event defined inside the embedded HTML page.\n- `session.HtmlViewer(id)` typed finder added to `GuiSession`.\n\n### GuiShell (new wrapper)\n\n- Added `GuiShell` as a typed generic fallback wrapper for SAP shell controls whose specific sub-type is not individually wrapped.\n- `SubType` property exposes the shell sub-type string (e.g. `\"GridView\"`, `\"TreeView\"`, `\"Chart\"`).\n- `session.Shell(id)` typed finder added to `GuiSession`.\n- `WrapComponent` now routes `GuiShell` type strings to `GuiShell` instead of falling through to the bare `GuiComponent` base.\n\n## [0.6.0]\n\n### GuiTextField\n\n- Added `DisplayedText` property — returns the formatted/displayed value as shown in SAP GUI (may differ from `Text` on amount or date fields where SAP applies locale-specific formatting).\n- Added `IsRequired` property — returns `true` if the field is mandatory (marked with `?`).\n- Added `IsOField` property — returns `true` if the field is an output-only screen field.\n\n### GuiMainWindow\n\n- Added `Iconify()` — minimizes the window to the taskbar.\n- Added `IsMaximized` property — returns `true` when the window is currently maximised.\n\n### GuiTree\n\n- Added `GetItemText(nodeKey, columnName)` — reads a cell value in a multi-column tree.\n- Added `GetAllNodeKeys()` — returns a flat `IReadOnlyList\u003cstring\u003e` of every node key in the tree.\n- Added `NodeContextMenu(nodeKey)` — opens the right-click context menu for a node.\n- Added `GetNodeType(nodeKey)` — returns the node type string (e.g. `\"LEAF\"`, `\"FOLDER\"`).\n\n### GuiComboBox\n\n- Added `ShowKey` property — returns `true` when the combo box shows the technical key rather than the description.\n- ~~`SetKeyAndFireEvent(key)`~~ — removed in 0.8.4; use `cb.Key = value` instead.\n\n## [0.5.0]\n\n### GuiSession\n\n- Added `ActiveWindow` property — returns the currently active (focused) window without guessing the `wnd[x]` index.\n- Added `CreateSession()` — opens a new parallel SAP session on the same connection.\n- Added polling-based .NET events: `Change`, `Destroy`, `AbapRuntimeError`. Call `StartMonitoring(pollMs)` / `StopMonitoring()` to activate. `SessionChangeEventArgs` carries `Text`, `FunctionCode`, and `MessageType`; `AbapRuntimeErrorEventArgs` carries `Message`.\n\n### GuiApplication\n\n- Added `ActiveSession` property — shortcut to the currently focused session.\n- Added `OpenConnection(description, sync)` — opens a new connection by SAP Logon Pad entry name and returns the resulting `GuiConnection`.\n\n### GuiGridView\n\n- Added `FirstVisibleRow` and `VisibleRowCount` — viewport scroll-awareness properties.\n- Added `CurrentCellRow` and `CurrentCellColumn` — focused cell coordinates.\n- Added `SetCurrentCell(row, column)` — navigates focus to a cell before reading tooltips, checkboxes, or invoking context menus.\n- Added `SelectedRows` — returns currently selected row indices as `IReadOnlyList\u003cint\u003e`.\n- Added `GetCellTooltip(row, column)` — reads the tooltip text on a cell.\n- Added `GetCellCheckBoxValue(row, column)` — reads boolean checkbox-type cells.\n- Added `GetSymbolsForCell(row, column)` — reads icon/symbol column values.\n- Added `PressEnter()` — confirms cell input.\n\n### GuiTable\n\n- Added `FirstVisibleRow` — index of the first visible row (replaces `VerticalScrollbarPosition`, removed in 1.0.0).\n- Added `VisibleRowCount` — number of rows visible in the current viewport.\n- Added `ScrollToRow(row)` — scrolls the table to put the given row at the top.\n- Added `CurrentCellRow` and `CurrentCellColumn` — row index and column key of the focused cell.\n\n### README\n\n- Rewritten with an RPA / UiPath Coded Workflow focus: new \"Why this wrapper?\" section, lead example as a full `CodedWorkflow`, consolidated \"Common patterns\" section covering all major automation scenarios.\n\n## [0.4.6]\n\n- Added `GuiSession.ExitTransaction()`: exits the current transaction and returns to the SAP Easy Access menu (writes `/n` to the command field and presses Enter).\n- Added `GuiSession.PressExecute()`: sends F8 (VKey 8) to the main window, equivalent to clicking the Execute button on a selection screen.\n- Fixed `GuiSession.SendVKey()` XML doc comment: corrected VKey-to-action mapping and expanded it to a reference table covering VKey 0/3/4/8/11/12/15.\n\n## [0.4.5]\n\n- Bug fix: `GuiMessageWindow.Text` now returns the actual message body text by reading the inner SAP text fields (`usr/txtMESSTXT1`…`usr/txtMESSTXT4`), joining non-empty lines with a space. Falls back to the window title if no inner fields exist.\n- Bug fix: `GuiMessageWindow.Title` and `.Text` were previously identical (both returned the window title bar text).\n\n## [0.4.4]\n\n- Bug fix: `GetActivePopup()` now correctly returns a `GuiMessageWindow` when the popup is a SAP `GuiModalWindow` (e.g. dialog boxes with form fields). Previously it returned `null` because `WrapComponent` maps `GuiModalWindow` to `GuiMainWindow`, causing the typed cast to fail silently.\n\n## [0.4.0]\n\n- Bug fix: SapComponentType.FromString now correctly resolves GuiMenu, GuiContextMenu, GuiApoGrid, GuiCalendar and GuiOfficeIntegration (previously returned Unknown).\n- Added GuiSession.RadioButton() typed convenience finder.\n- Fixed SapGuiHelper.GetSession COM handle leak (now properly disposed).\n- Full XML documentation on all public members (zero CS1591 warnings).\n\n## [0.3.0]\n\n- Added typed wrappers: GuiTabStrip, GuiTab, GuiToolbar, GuiMenubar, GuiMenu, GuiContextMenu, GuiMessageWindow.\n- Added GuiSession convenience finders: TabStrip(), Tab(), Toolbar(), Menubar(), Menu(), Tree(), GetActivePopup().\n- FindById() now returns typed instances for all newly added types.\n- SapComponentType enum extended with GuiMenu, GuiContextMenu, GuiCalendar, GuiOfficeIntegration.\n\n## [0.2.0]\n\n- All public types moved into a single SapGui.Wrapper namespace. Only one import is now needed: Imports SapGui.Wrapper (VB.NET) or using SapGui.Wrapper; (C#).\n\n## [0.1.0]\n\n- Added findById(id) camelCase alias on GuiSession returning dynamic; recorder VBScript can be used in C# with only one change: add () to method calls.\n- Added FindByIdDynamic(id) returning dynamic for full IDispatch late-binding.\n- Promoted Text, Press() and SetFocus() to GuiComponent base class; FindById(id).Text / .Press() / .SetFocus() now work without casting.\n\n## [0.0.0]\n\n- Initial release.","dependency_summary":{"total_dependency_groups":2,"target_frameworks":[".NETFramework4.6.1","net8.0-windows7.0"],"total_dependencies":2}},"repo_metadata":{"id":341876983,"uuid":"1171857906","full_name":"alexrivax/SapGui.Wrapper","owner":"alexrivax","description":"Wrapper for SAP GUI Automation using dotnet","archived":false,"fork":false,"pushed_at":"2026-03-03T18:07:59.000Z","size":73,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-03T21:36:56.310Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alexrivax.png","metadata":{},"created_at":"2026-03-03T17:26:09.000Z","updated_at":"2026-03-03T18:04:49.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/alexrivax/SapGui.Wrapper","commit_stats":null,"previous_names":["alexrivax/sapgui.wrapper"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/alexrivax/SapGui.Wrapper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexrivax%2FSapGui.Wrapper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexrivax%2FSapGui.Wrapper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexrivax%2FSapGui.Wrapper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexrivax%2FSapGui.Wrapper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alexrivax","download_url":"https://codeload.github.com/alexrivax/SapGui.Wrapper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexrivax%2FSapGui.Wrapper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30141295,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-05T16:58:46.102Z","status":"ssl_error","status_checked_at":"2026-03-05T16:58:45.706Z","response_time":93,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"repo_metadata_updated_at":"2026-07-12T21:30:14.137Z","dependent_packages_count":0,"downloads":991,"downloads_period":"total","dependent_repos_count":0,"rankings":{"downloads":56.18717424275474,"dependent_repos_count":6.181436330346749,"dependent_packages_count":16.513619136027245,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":26.294076569709578},"purl":"pkg:nuget/sapgui.wrapper","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/nuget/sapgui.wrapper","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/nuget/sapgui.wrapper","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/nuget/sapgui.wrapper/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/nuget.org/packages/sapgui.wrapper/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/nuget.org/packages/sapgui.wrapper/version_numbers","latest_version_url":"https://packages.ecosyste.ms/api/v1/registries/nuget.org/packages/sapgui.wrapper/latest_version","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/nuget.org/packages/sapgui.wrapper/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/nuget.org/packages/sapgui.wrapper/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/nuget.org/packages/sapgui.wrapper/codemeta","maintainers":[{"uuid":"AlexRivax","login":"AlexRivax","name":null,"email":null,"url":null,"packages_count":2,"html_url":"https://www.nuget.org/profiles/AlexRivax","role":null,"created_at":"2026-03-03T18:15:36.629Z","updated_at":"2026-03-03T18:15:36.629Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/nuget.org/maintainers/AlexRivax/packages"}]}