如何实现用c语言在window右下角通知中心中输出字符串?

题目描述

如何实现用c语言在window右下角通知中心中输出字符串?

题目来源及自己的思路

大一新生,刚刚开始接触c语言,最近遇到一个问题:
c语言能不能不通过命令窗口,而是通过windows右下角的弹出通知进行输出呢?

相关代码

word[3]={"ab"};
_

你期待的结果是什么?实际看到的错误信息又是什么?

右下角弹出通知“ab”,而未通过命令窗口;

阅读 3.2k
4 个回答

在 Windows 操作系统中,通知中心是通过 WinRT API 实现的,可以使用 C++/WinRT 或 C# 等语言来操作。如果你想使用 C 语言来实现,可以通过使用 Windows 运行时(Windows Runtime,简称 WinRT)的 C 语言绑定来实现。

具体步骤如下:

创建 WinRT 项目,并添加所需的引用库。可以使用 Visual Studio 来创建 WinRT 项目。在创建项目时,请选择“WinRT 组件库”模板,并添加所需的引用库(如 Windows.UI.Notifications)。

编写代码来创建通知和显示通知。下面是示例代码:

#include <Windows.h>
#include <wrl/client.h>
#include <windows.ui.notifications.h>
#include <windows.data.xml.dom.h>

using namespace Microsoft::WRL;
using namespace Windows::UI::Notifications;
using namespace Windows::Data::Xml::Dom;

int main()
{
    HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
    if (FAILED(hr))
    {
        return 1;
    }

    ComPtr<IToastNotificationManagerStatics> toastStatics;
    hr = RoGetActivationFactory(
        HStringReference(L"Windows.UI.Notifications.ToastNotificationManager").Get(),
        __uuidof(IToastNotificationManagerStatics),
        reinterpret_cast<void**>(toastStatics.GetAddressOf()));
    if (FAILED(hr))
    {
        return 1;
    }

    ComPtr<IToastNotificationFactory> toastFactory;
    hr = RoGetActivationFactory(
        HStringReference(L"Windows.UI.Notifications.ToastNotification").Get(),
        __uuidof(IToastNotificationFactory),
        reinterpret_cast<void**>(toastFactory.GetAddressOf()));
    if (FAILED(hr))
    {
        return 1;
    }

    ComPtr<IXmlDocument> toastXml;
    hr = toastStatics->GetTemplateContent(ToastTemplateType_ToastText01, toastXml.GetAddressOf());
    if (FAILED(hr))
    {
        return 1;
    }

    WCHAR message[] = L"Hello, world!";
    ComPtr<IXmlNodeList> toastTextElements;
    hr = toastXml->GetElementsByTagName(HStringReference(L"text").Get(), toastTextElements.GetAddressOf());
    if (FAILED(hr))
    {
        return 1;
    }

    ComPtr<IXmlNode> toastTextElement;
    hr = toastTextElements->Item(0, toastTextElement.GetAddressOf());
    if (FAILED(hr))
    {
        return 1;
    }

    ComPtr<IXmlText> toastText;
    hr = toastXml->CreateTextNode(HStringReference(message).Get(), toastText.GetAddressOf());
    if (FAILED(hr))
    {
        return 1;
    }

    hr = toastTextElement->AppendChild(toastText.Get(), nullptr);
    if (FAILED(hr))
    {
        return 1;
    }

    ComPtr<IToastNotification> toast;
    hr = toastFactory->CreateToastNotification(toastXml.Get(), toast.GetAddressOf());
    if (FAILED(hr))
    {
        return 1;
    }

    ComPtr<IToastNotifier> notifier;
    hr = toastStatics->CreateToastNotifierWithId(HStringReference(L"MyApp").Get(), notifier.GetAddressOf());
    if (FAILED(hr))
    {
        return 1;
    }

    hr = notifier->Show(toast.Get());
    if (FAILED(hr))
    {
        return 1;
    }

    return 
#include <windows.h>

int main() {
    // 初始化 NOTIFYICONDATA 结构体
    NOTIFYICONDATA nid = { sizeof(nid) };
    nid.hWnd = GetDesktopWindow();
    nid.uFlags = NIF_INFO;
    nid.dwInfoFlags = NIIF_INFO;
    // 设置通知标题和内容
    strcpy_s(nid.szInfoTitle, sizeof(nid.szInfoTitle), "Notification Title");
    strcpy_s(nid.szInfo, sizeof(nid.szInfo), "This is the notification message.");
    // 显示通知
    Shell_NotifyIcon(NIM_ADD, &nid);
    return 0;
}

只能回答你可以,
大家都一样,刚接触编程,特别是C语言,每天对这一个黑忽忽的窗口练习加减乘除,判断,循环,似乎什么有用的东西都做不出来,很烦恼。想做一点有用的事情。

C语言相对底层,可以说没有什么它做不了的,别的语言能做到的事情,它肯定可以做到,别的语言,做不到的事情,它也可以做到

但是就是因为它相对底层,所以很多事情,都要自己去做,不像很多高级语言,已经帮你做好了很多事情,你简单的调用一个API,就可以做到 C 需要成千上万行代码来做到同样的效果。

比如你的个需求,在你熟练掌握C以后,可以去看windows 编程相关的书,你就会学习到这方面的知识,现阶段同学还是好好学C本身吧。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏