У меня есть приложение под названием «Zone App» (написанное на dart) с собственным кодом C++, скомпилированное как .exe для Windows.
Я хочу отобразить элемент для этого приложения в Центре уведомлений и действий Windows с помощью кнопки переключения, чтобы пользователь мог нажать кнопку переключения, чтобы включить/отключить уведомления для «Приложения зоны».
На данный момент я написал этот код, чтобы сделать это:
#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. Но кнопка переключения не работает, не меняет своего состояния при нажатии. Почему это?
У меня есть приложение под названием «Zone App» (написанное на dart) с собственным кодом C++, скомпилированное как .exe для Windows. Я хочу отобразить элемент для этого приложения в Центре уведомлений и действий Windows с помощью кнопки переключения, чтобы пользователь мог нажать кнопку переключения, чтобы включить/отключить уведомления для «Приложения зоны». На данный момент я написал этот код, чтобы сделать это: [code].iss[/code] Код сценария установщика: [code][Files] Source: "..\build\windows\x64\runner\Release\ToastNotifier.dll"; DestDir: "{app}"; Flags: ignoreversion regserver
// 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; } [/code] Используя весь этот код, запись «Приложение Zone» появляется в Центре уведомлений и действий Windows. Но кнопка переключения не работает, не меняет своего состояния при нажатии. Почему это?