From WinHelp to Visual WinHelp: Best Practices for Desktop Help SystemsWindows Help has traveled a long road — from the classic .hlp WinHelp files to compiled HTML Help (.chm) and modern context-sensitive help systems. Many organizations still maintain desktop applications that ship with legacy help content, and refactoring that documentation into a modern, maintainable, and accessible form is both a technical and UX challenge. This article outlines a practical migration path from WinHelp to Visual WinHelp (a contemporary, visual-focused approach to desktop help), and presents best practices for creating help systems that are usable, maintainable, and aligned with modern accessibility and localization needs.
Why migrate from WinHelp?
- Security and compatibility: Classic WinHelp (.hlp) is deprecated on modern Windows versions and can pose security and compatibility risks.
- User expectations: Users expect search, context-sensitivity, rich media, and accessibility features that old formats lack.
- Maintainability: Modern authoring tools and formats support modular content, single-source publishing, and easier localization.
- Integration: New help systems integrate better with installers, telemetry, IDEs, and other product tooling.
What is Visual WinHelp?
Visual WinHelp isn’t a single product but rather a design and engineering approach: creating visually rich, interactive, and context-aware help for desktop applications while preserving the low-friction access patterns users expect (F1 context help, tooltips, searchable manuals). It combines modern authoring formats (Markdown, HTML5, single-source XML), visual components (embedded images, videos, animated GIFs), and delivery mechanisms that work well with native desktop UI frameworks.
Core principles
- Keep help discoverable and context-sensitive.
- Favor single-source content that can output to multiple formats (in-app help, web docs, printable PDFs).
- Design for accessibility from the start.
- Use version control and CI to manage content changes.
- Track usage to prioritize updates (respecting privacy).
Planning the Migration
1. Inventory existing content
- Export a list of all topics, indices, and context IDs from .hlp/.rtf/.chm files.
- Note which topics map to application context IDs (F1 keys, topic IDs used in code).
- Classify topics by age, usage, and relevance: keep, update, merge, or retire.
2. Choose formats and tools
- Authoring formats: Markdown (for simplicity), DocBook or DITA (for complex structured publishing), or HTML5 for full control.
- Tooling: static site generators (Hugo, MkDocs), help-authoring tools (MadCap Flare, HelpNDoc), or custom pipelines that compile source into in-app help packages.
- Delivery: embedded HTML viewer, system browser fallback, or compiled help packages that your app ships with.
3. Map context IDs and APIs
- Maintain a mapping table from old WinHelp topic IDs to new URLs or resource paths.
- Provide a lightweight API layer in the application to request a help topic by ID and open it in the appropriate viewer.
Authoring Best Practices
Content structure and modularity
- Use a clear hierarchy: tasks > procedures > reference.
- Write concise task-based topics that answer “how do I do X?” quickly.
- Break large topics into smaller, reusable modules to support single-source publishing.
Writing style
- Use plain language and active voice.
- Prioritize steps and quick answers at the top of each topic (inverted pyramid).
- Use examples and screenshots where they reduce ambiguity.
Visual design and media
- Prefer annotated screenshots over raw images. Use callouts and overlays to focus attention.
- For workflows, consider short screencasts or animated GIFs (keep file sizes reasonable).
- When embedding code or configuration, use syntax highlighting and copy-to-clipboard buttons.
Accessibility
- Provide semantic HTML: headings, lists, landmarks, and ARIA roles as needed.
- Include alt text for images and transcripts or captions for audio/video.
- Ensure color contrast and keyboard navigability for the help viewer. Screen readers should read topic titles, landmarks, and link context sensibly.
Implementation Patterns
Option A — Embedded HTML viewer
- Ship a small web runtime (embedded browser control) in the app that renders packaged HTML5 help.
- Advantages: rich UI, CSS theming, offline support.
- Considerations: choose a maintained browser control (Edge WebView2 on Windows) and keep the runtime updated for security.
Option B — System browser fallback
- Open help topics in the system default browser when the user requests help.
- Advantages: no embedded runtime to maintain.
- Considerations: offline access and context-sensitivity must be handled (local files or local web server approach).
Option C — Compiled help with local server
- Package help files and run a lightweight local HTTP server (internal to the app) to serve the content, then open the embedded or system browser to http://localhost:xxxx.
- Advantages: same authoring/output as web docs, consistent behavior, easier routing for context IDs.
- Considerations: manage port conflicts and lifecycle of the local server.
Context-Sensitive Help Integration
- Keep a mapping table between UI elements and help topic identifiers. Store this mapping in a human-editable form (YAML/JSON) alongside the source content.
- Implement logic in the app to open help for the current UI context (F1, Help button). For web-based help, pass query parameters that the help system uses to highlight or anchor to the relevant section.
- For dynamic or plugin-driven UIs, provide a registration API so modules can register/unregister their help topics at runtime.
Search and Discovery
- Provide full-text search with relevance ranking (title and headings weighted higher). Consider client-side search indexes (Lunr.js, FlexSearch) for offline use.
- Add a keyword index and topic summaries for quick scanning.
- Use breadcrumbs and a clear table of contents to help users navigate.
Internationalization & Localization
- Single-source where possible: separate translatable content from UI strings.
- Use resource bundles or localization files per language. Keep images and screenshots with callouts localized when they contain text.
- Maintain translation memory and glossary to keep terminology consistent.
- Version content and track which translations lag behind source updates.
Versioning, CI, and Content Workflow
- Store source content in Git. Treat documentation like code: pull requests, reviews, and CI checks (link validation, spellcheck, accessibility linting).
- Automate builds that output help packages for each target (embedded, web, PDF).
- Tag help builds with product versions to allow users to access docs matching their installed app version.
Analytics and Feedback
- Instrument the help viewer to record anonymous usage metrics: most-viewed topics, search queries, exit points. Respect privacy and local laws.
- Provide an inline feedback control (Was this helpful? Report issue) that captures context (topic ID, app version) and routes to your issue tracker.
- Use analytics to prune rarely used topics and prioritize updates.
Security and Distribution
- Sanitize and validate any content rendered inside an embedded browser control. Disable unnecessary features (node integrations, file:// script execution) depending on your runtime.
- Ship help packages signed and versioned. Use atomic updates for incremental help content delivery.
- If help content is fetched remotely, use HTTPS, verify certificates, and implement integrity checks.
Example Migration Workflow (practical steps)
- Export and catalog old topics and context IDs.
- Select an authoring format (e.g., Markdown + frontmatter for metadata).
- Create a small conversion script to transform .hlp/.rtf/.chm extracts into Markdown, preserving topic IDs as frontmatter.
- Set up a Git repo and CI pipeline that builds help into an HTML site and a packaged asset for the app.
- Integrate WebView2 (Windows) in the app and point help requests to the local packaged content.
- Implement search indexing (Lunr.js) during the build step.
- Add accessibility checks in CI and manual accessibility testing.
- Roll out as a beta, collect feedback and analytics, iterate.
Common Pitfalls and How to Avoid Them
- Recreating the manual: avoid porting every legacy topic verbatim. Merge and modernize content with a focus on tasks.
- Large media bloat: optimize images and prefer short videos or animated GIFs with clear captions.
- Breaking context links: maintain a mapping layer and deprecation notices for old topic IDs.
- Neglecting accessibility: test with screen readers and keyboard-only navigation early, not as an afterthought.
Case Study (concise example)
A mid-size accounting app had 2,000 WinHelp topics. The team:
- Audited and reduced to 800 modular topics.
- Converted core task topics to Markdown, added screenshots and step-by-step examples.
- Adopted WebView2 with a packaged static HTML build, full-text Lunr.js search, and an in-app feedback button.
Result: help usage increased 40%, support tickets for basic tasks dropped 22%, and localization time per language dropped by 30% due to modular content.
Conclusion
Moving from WinHelp to a Visual WinHelp approach is more than a file-format conversion — it’s a chance to rethink how help supports users. Prioritize discoverability, context, accessibility, and maintainability. Use single-source content, automated builds, and modern viewer technologies (like WebView2) to deliver rich, offline-capable, and easy-to-update help. With a pragmatic migration plan and attention to usability, you can turn legacy help into a living, valuable part of your desktop product experience.
Leave a Reply