Как отобразить мое приложение в Центре уведомлений и действий Windows с помощью переключателя, чтобы пользователь мог вкC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как отобразить мое приложение в Центре уведомлений и действий Windows с помощью переключателя, чтобы пользователь мог вк

Сообщение Anonymous »

У меня есть приложение под названием «Zone App» (написанное на dart) с собственным кодом C++, скомпилированное как .exe для Windows.
Я хочу отобразить элемент для этого приложения в Центре уведомлений и действий Windows с помощью кнопки переключения, чтобы пользователь мог нажать кнопку переключения, чтобы включить/отключить уведомления для «Приложения зоны».
На данный момент я написал этот код, чтобы сделать это: Код сценария установщика:

Код: Выделить всё

[Files]
Source: "..\build\windows\x64\runner\Release\ToastNotifier.dll"; DestDir: "{app}"; Flags: ignoreversion regserver

[Registry]
Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\{{#MyAppId}"; ValueName: "Enabled"; ValueType: dword; ValueData: 0; Flags: createvalueifdoesntexist uninsdeletekey
Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\{{#MyAppId}"; ValueName: "ToastEnabled"; ValueType: dword; ValueData: 1; Flags: createvalueifdoesntexist uninsdeletekey
Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\{{#MyAppId}"; ValueName: "DisplayName"; ValueType: string; ValueData: "{#MyAppName}"; Flags: createvalueifdoesntexist uninsdeletekey

Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\PushNotifications\{{#MyAppID}"; ValueType: string; ValueName: "DisplayName"; ValueData: "{#MyAppName}"
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\PushNotifications\{{#MyAppID}"; ValueType: string; ValueName: "Description"; ValueData: "Zone App Description"
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\PushNotifications\{{#MyAppID}"; ValueType: dword; ValueName: "Enabled"; ValueData: 0
Root: HKCU; Subkey: "Software\Classes\AppUserModelId\{{#MyAppId}"; ValueName: "DisplayName"; ValueType: string; ValueData: "{#MyAppName}"; Flags: createvalueifdoesntexist uninsdeletekey
Root: HKCU; Subkey: "Software\Classes\AppUserModelId\{{#MyAppId}"; ValueName: "ToastActivatorCLSID"; ValueType: string; ValueData: "{{#MyToastActivatorCLSID}"; Flags: createvalueifdoesntexist uninsdeletekey

[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; AppUserModelID: "{{#MyAppId}"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon; AppUserModelID: "{{#MyAppId}"
Name: "{commonstartmenu}\Programs\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; AppUserModelID: "{{#MyAppId}"
Код ToastNotifier.dll (это DLL COM-сервера):

Код: Выделить всё

#include "pch.h"
#include 
#include 
#include 

class DummyToastActivator : public IUnknown {
public:
DummyToastActivator() : refCount(1) {}

STDMETHODIMP QueryInterface(REFIID riid, void** ppv) override {
if (riid == IID_IUnknown) {
*ppv = static_cast(this);
AddRef();
return S_OK;
}
*ppv = nullptr;
return E_NOINTERFACE;
}

STDMETHODIMP_(ULONG) AddRef() override {
return InterlockedIncrement(&refCount);
}

STDMETHODIMP_(ULONG) Release() override {
LONG ref = InterlockedDecrement(&refCount);
if (ref == 0) {
delete this;
}
return ref;
}

private:
LONG refCount;
};

// GUID for the COM object
const CLSID CLSID_DummyToastActivator = { 0x95DA8DD5, 0x7867, 0x4A94, { 0xAA, 0xEC, 0xFC, 0x36, 0x33, 0x63, 0xC0, 0x4A } };

// CLSID for registering in the registry
const wchar_t* CLSID_KEY = L"Software\\Classes\\CLSID\\{95DA8DD5-7867-4A94-AAEC-FC363363C04A}";
const wchar_t* LOCAL_SERVER_KEY = L"Software\\Classes\\CLSID\\{95DA8DD5-7867-4A94-AAEC-FC363363C04A}\\InProcServer32";

extern "C"  __declspec(dllexport) HRESULT WINAPI DllRegisterServer() {
HKEY hKey;

// Register CLSID in the registry
if (RegCreateKeyExW(HKEY_CURRENT_USER, CLSID_KEY, 0, nullptr, 0, KEY_WRITE, nullptr, &hKey, nullptr) == ERROR_SUCCESS) {
// Set the default value for CLSID (just the name)
RegSetValueExW(hKey, nullptr, 0, REG_SZ, (const BYTE*)L"DummyToastActivator", (wcslen(L"DummyToastActivator") + 1) * sizeof(wchar_t));

// Create the LocalServer32 key and associate with the DLL path
HKEY hLocalServerKey;
if (RegCreateKeyExW(HKEY_CURRENT_USER, LOCAL_SERVER_KEY, 0, nullptr, 0, KEY_WRITE, nullptr, &hLocalServerKey, nullptr) == ERROR_SUCCESS) {
wchar_t dllPath[] = L"C:\\Program Files (x86)\\Zone App\\ToastNotifier.dll";
RegSetValueExW(hLocalServerKey, nullptr, 0, REG_SZ, (const BYTE*)dllPath, (wcslen(dllPath) + 1) * sizeof(wchar_t));
RegCloseKey(hLocalServerKey);
}

RegCloseKey(hKey);
}

return S_OK;
}

extern "C" __declspec(dllexport) HRESULT WINAPI DllUnregisterServer() {
// Unregister the CLSID by deleting the registry keys
RegDeleteKeyW(HKEY_CURRENT_USER, CLSID_KEY);
RegDeleteKeyW(HKEY_CURRENT_USER, LOCAL_SERVER_KEY);

return S_OK;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Используя весь этот код, запись «Приложение Zone» появляется в Центре уведомлений и действий Windows. Но кнопка переключения не работает, не меняет своего состояния при нажатии. Почему это?


Подробнее здесь: https://stackoverflow.com/questions/793 ... a-toggle-b
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»