Vytvoření nativního doplňku jazyka C++ s oznámeními

V této příručce se dozvíte, jak vytvořit nativní doplněk jazyka C++, který volá rozhraní API pro oznámení Windows App SDK ve vaší aplikaci Electron. Toto je skvělý výchozí bod pro pochopení nativních doplňků před tím, než se ponoříte do složitějších scénářů.

Předpoklady

Než začnete s touto příručkou, ujistěte se, že máte:

Krok 1: Vytvoření nativního doplňku jazyka C++

Pojďme vytvořit nativní doplněk pomocí C++ a node-addon-api. To poskytuje přímý přístup k rozhraním API Windows s maximálním výkonem.

npx winapp node create-addon

Poznámka:

Tento příkaz vás může vyzvat k instalaci Python nebo požadovaných nástrojů Visual Studio, pokud je ještě nemáte nainstalované.

Tím se nativeWindowsAddon/ vytvoří složka s:

  • nativeWindowsAddon.cc – Váš kód C++, který bude volat rozhraní API systému Windows
  • binding.gyp – Konfigurace sestavení pro Node-gyp

Příkaz také nainstaluje požadované závislosti vývoje (nan, node-addon-api, node-gyp) a přidá build-nativeWindowsAddon skript do vašeho package.json:

{
  "scripts": {
    "build-nativeWindowsAddon": "node-gyp clean configure build --directory=nativeWindowsAddon"
  }
}

Vygenerovaná šablona obsahuje ukázkovou funkci ShowNotification, která používá rozhraní API pro oznámení sady Windows SDK. Pojďme ověřit, jestli je všechno správně nastavené, a to sestavením doplňku:

# Build the C++ addon
npm run build-nativeWindowsAddon

Poznámka:

Můžete také vytvořit doplněk jazyka C# pomocí npx winapp node create-addon --template cs. Doplňky jazyka C# používají node-api-dotnet. Další možnosti najdete v dalších příručkách k vytváření doplňků nebo úplné dokumentace k příkazům .

Krok 2: Otestování vygenerovaného doplňku

Pojďme ověřit, že vygenerovaný doplněk funguje tak, že ho zavoláme z hlavního procesu. Otevřít src/index.js:

  1. Přidejte import doplňku k ostatním require příkazům nahoře:
const nativeWindowsAddon = require('../nativeWindowsAddon/build/Release/nativeWindowsAddon.node');
  1. Vyvolejte funkci oznámení na konci funkce createWindow().
const createWindow = () => {
  // ... existing window creation code ...

  // Test the Windows SDK notification
  nativeWindowsAddon.showNotification(
    'Hello from Electron!',
    'This notification uses the Windows SDK.'
  );
};

Než rozhraní API pro oznámení bude fungovat, musíte zajistit, aby vaše aplikace běžela s identitou. Běh:

npx winapp node add-electron-debug-identity

Poznámka:

Tento příkaz je již součástí postinstall skriptu, který jsme přidali v průvodci nastavením, takže se spustí automaticky po npm install. Musíte ho ale spustit ručně pokaždé, když upravíte Package.appxmanifest, aktualizujete prostředky aplikace nebo přeinstalujete závislosti.

Teď spusťte aplikaci:

npm start

Mělo by se zobrazit oznámení. 🎉 Vygenerovaný doplněk funguje ihned.

⚠️ Známý problém: Chybové ukončení aplikace nebo prázdné okno (kliknutím rozbalte)

Existuje známá chyba Windows s řídkým balením aplikací Electron, která způsobuje, že aplikace se při startu zhroutí nebo nevykreslí webový obsah. Tento problém je opravený v Windows, ale zatím se nerozšířel na všechna zařízení.

Alternativní řešení najdete v části Nastavení vývojového prostředí .

Krok 3: Aktualizace oznámení v Windows App SDK

Teď, když jsme potvrdili, že doplněk funguje, upgradujeme ho tak, aby používal moderní rozhraní API pro oznámení Windows App SDK (Microsoft.Windows.AppNotifications), která poskytují lepší prostředí pro vývojáře a další funkce. Po spuštění příkazu inicializačního příkazu z kroků nastavení jsme už nastavili Windows App SDK.

Otevřete nativeWindowsAddon/nativeWindowsAddon.cc a nahraďte celý obsah tímto kódem:

#include <napi.h>
#include <windows.h>

#include <winrt/Windows.Foundation.h>
#include <winrt/Microsoft.Windows.AppNotifications.h>
#include <winrt/Microsoft.Windows.AppNotifications.Builder.h>

using namespace winrt;
using namespace Microsoft::Windows::AppNotifications;
using namespace Microsoft::Windows::AppNotifications::Builder;

// Function to display a Windows App SDK notification
void ShowNotification(const Napi::CallbackInfo& info) {
    Napi::Env env = info.Env();

    try {
        // Get arguments from JavaScript (title and message)
        if (info.Length() < 2 || !info[0].IsString() || !info[1].IsString()) {
            Napi::TypeError::New(env, "Expected two string arguments: title and message").ThrowAsJavaScriptException();
            return;
        }

        std::string title = info[0].As<Napi::String>();
        std::string message = info[1].As<Napi::String>();

        // Convert to wide strings
        std::wstring wTitle(title.begin(), title.end());
        std::wstring wMessage(message.begin(), message.end());

        // Use AppNotificationBuilder for a cleaner API
        AppNotificationBuilder builder;
        builder.AddText(wTitle);
        builder.AddText(wMessage);
        
        AppNotification notification = builder.BuildNotification();
        AppNotificationManager::Default().Show(notification);

    } catch (const winrt::hresult_error& ex) {
        Napi::Error::New(env, winrt::to_string(ex.message())).ThrowAsJavaScriptException();
    } catch (const std::exception& ex) {
        // Handle exceptions and throw back to JavaScript
        Napi::Error::New(env, ex.what()).ThrowAsJavaScriptException();
    } catch (...) {
        Napi::Error::New(env, "Unknown error occurred").ThrowAsJavaScriptException();
    }
}

// Initialize the module
Napi::Object Init(Napi::Env env, Napi::Object exports) {
    exports.Set(Napi::String::New(env, "showNotification"), Napi::Function::New(env, ShowNotification));
    return exports;
}

NODE_API_MODULE(addon, Init)

Klíčové změny zde přecházejí ze staršího oboru názvů Windows.UI.Notifications na moderní rozhraní API Microsoft.Windows.AppNotifications a použití AppNotificationBuilder k vytváření oznámení místo ručního sestavování řetězců XML. To poskytuje čistější a lépe udržovatelné rozhraní API, které je konzistentní se vzory Windows App SDK.

Krok 4: Opětovné sestavení a testování

Teď znovu sestavte doplněk s aktualizovaným kódem:

npm run build-nativeWindowsAddon

Aktualizujte zprávu src/index.js tak, aby odrážela změnu:

nativeWindowsAddon.showNotification(
  'Hello from Electron!',
  'This notification is powered by the Windows App SDK!'
);

Spusťte aplikaci znovu:

npm start

Aktualizované oznámení se zobrazí pomocí moderních rozhraní API pro Windows App SDK.

Další kroky

Gratulujeme! Úspěšně jste vytvořili nativní doplněk C++, který volá rozhraní Windows App SDK! 🎉

Teď jste připraveni:

Nebo prozkoumejte další příručky:

Další zdroje