使用国产AI模型进行“委婉劝学程序”的模拟实现||创建可执行程序营造惊喜感

今日,我舍友上课经常上课玩电脑,不好好学习;

作为舍友我十分心痛,心想不能让祖国的花朵就这么沉迷下去了;

固有此程序,出此教程只为让更多热心善良的舍友能用这么委婉的方式劝诫学习

使用工具:豆包,vs2022

结构图:

1.首先,打开豆包网页版:

1.先打声招呼:(并非多此一举,ai也是需要正向反馈的)

2.输入情境:

今日,我舍友上课经常上课玩电脑,不好好学习; 作为舍友我十分心痛,心想不能让祖国的花朵就这么沉迷下去了;

3.我想出一个十分委婉的方法,设计一个程序,点击后出现弹窗,只有在文本框里输入我以后会好好学习才能结束程序。豆包能不能帮我用c++语言实现,我是用vs2022

4.豆包首次生成代码

对于我们的需求不要一开始就设置得很麻烦,功能很复杂,一开始就增加生成的代码的复杂程度只会使得程序难以实现。

先让豆包生成程序的大概框架即可;

cpp 复制代码
#include <Windows.h>
#include <string.h>

// 控件ID定义
#define ID_EDIT 1001    // 文本框ID
#define ID_BUTTON 1002  // 按钮ID

// 窗口过程函数声明(处理窗口消息)
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

// 程序入口(WinMain是Windows程序的入口,而非main)
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    // 1. 注册窗口类
    WNDCLASS wc = { 0 };
    wc.lpfnWndProc = WndProc;                // 绑定窗口过程函数
    wc.hInstance = hInstance;                // 应用实例句柄
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW; // 窗口背景色(白色)
    wc.lpszClassName = L"StudyReminderClass";// 窗口类名(Unicode宽字符)
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);// 鼠标光标

    if (!RegisterClass(&wc))
    {
        MessageBox(NULL, L"窗口类注册失败!", L"错误", MB_ICONERROR);
        return 0;
    }

    // 2. 创建窗口
    HWND hWnd = CreateWindow(
        L"StudyReminderClass",                // 窗口类名
        L"好好学习提醒器",                    // 窗口标题
        WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX, // 窗口样式(禁止最大化/最小化)
        CW_USEDEFAULT, CW_USEDEFAULT,          // 窗口初始位置(系统默认)
        400, 200,                             // 窗口大小(宽400,高200)
        NULL, NULL, hInstance, NULL
    );

    if (!hWnd)
    {
        MessageBox(NULL, L"窗口创建失败!", L"错误", MB_ICONERROR);
        return 0;
    }

    // 3. 显示并更新窗口
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    // 4. 消息循环(保持窗口运行,处理用户操作)
    MSG msg = { 0 };
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

// 窗口过程函数(核心:处理所有窗口事件)
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HWND hEdit;  // 文本框句柄(static保证生命周期)
    static HWND hBtn;   // 按钮句柄

    switch (uMsg)
    {
    // 窗口创建时触发(初始化控件)
    case WM_CREATE:
        // 创建文本输入框(编辑框)
        hEdit = CreateWindow(
            L"EDIT",                          // 控件类名(编辑框)
            L"",                              // 初始文本
            WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT, // 控件样式(可见、带边框、左对齐)
            50, 50, 280, 30,                  // 位置(x,y)和大小(宽,高)
            hWnd, (HMENU)ID_EDIT,             // 父窗口+控件ID
            ((LPCREATESTRUCT)lParam)->hInstance, NULL
        );
        // 设置文本框提示文字(可选)
        SetWindowText(hEdit, L"请输入指定内容才能退出...");

        // 创建确认按钮
        hBtn = CreateWindow(
            L"BUTTON",                        // 控件类名(按钮)
            L"确认",                          // 按钮文字
            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, // 控件样式(可见、下压式)
            150, 100, 80, 30,                 // 位置和大小
            hWnd, (HMENU)ID_BUTTON,            // 父窗口+控件ID
            ((LPCREATESTRUCT)lParam)->hInstance, NULL
        );
        break;

    // 控件点击/操作时触发(按钮点击事件)
    case WM_COMMAND:
        if (LOWORD(wParam) == ID_BUTTON) // 判断是否是「确认」按钮被点击
        {
            WCHAR inputText[100] = { 0 }; // 存储用户输入的文本(宽字符,适配中文)
            GetWindowText(hEdit, inputText, 100); // 获取文本框内容

            // 验证输入是否为「我以后会好好学习」
            if (wcscmp(inputText, L"我以后会好好学习") == 0)
            {
                MessageBox(hWnd, L"真棒!说到做到哦~", L"成功", MB_ICONINFORMATION);
                DestroyWindow(hWnd); // 关闭窗口,程序退出
            }
            else
            {
                // 输入错误,提示并清空文本框
                MessageBox(hWnd, L"输入错误!再好好想想~", L"提示", MB_ICONWARNING);
                SetWindowText(hEdit, L""); // 清空文本框
                SetFocus(hEdit); // 光标回到文本框,方便重新输入
            }
        }
        break;

    // 窗口关闭时触发
    case WM_DESTROY:
        PostQuitMessage(0); // 退出消息循环
        break;

    // 其他未处理的消息,按默认方式处理
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    return 0;
}

将代码复制到vs,ctrl+F5启动编译

如果产生报错

截图生成的解决方案

复制询问豆包

修正代码

cpp 复制代码
#include <Windows.h>
#include <string.h>

#define ID_EDIT 1001
#define ID_BUTTON 1002

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

// 修正WinMain的声明(严格匹配Windows API标准,解决C2825)
int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
{
    WNDCLASS wc = { 0 };
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.lpszClassName = L"StudyReminderClass";
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);

    if (!RegisterClass(&wc))
    {
        MessageBox(NULL, L"窗口类注册失败!", L"错误", MB_ICONERROR);
        return 0;
    }

    HWND hWnd = CreateWindow(
        L"StudyReminderClass",
        L"好好学习提醒器",
        WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX,
        CW_USEDEFAULT, CW_USEDEFAULT,
        400, 200,
        NULL, NULL, hInstance, NULL
    );

    if (!hWnd)
    {
        MessageBox(NULL, L"窗口创建失败!", L"错误", MB_ICONERROR);
        return 0;
    }

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    MSG msg = { 0 };
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    // 显式转换,解决C4244警告
    return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HWND hEdit;
    static HWND hBtn;

    switch (uMsg)
    {
    case WM_CREATE:
        hEdit = CreateWindow(
            L"EDIT",
            L"请输入指定内容才能退出...",
            WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT,
            50, 50, 280, 30,
            hWnd, (HMENU)ID_EDIT,
            ((LPCREATESTRUCT)lParam)->hInstance, NULL
        );

        hBtn = CreateWindow(
            L"BUTTON",
            L"确认",
            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            150, 100, 80, 30,
            hWnd, (HMENU)ID_BUTTON,
            ((LPCREATESTRUCT)lParam)->hInstance, NULL
        );
        break;

    case WM_COMMAND:
        if (LOWORD(wParam) == ID_BUTTON)
        {
            WCHAR inputText[100] = { 0 };
            GetWindowText(hEdit, inputText, 100);

            if (wcscmp(inputText, L"我以后会好好学习") == 0)
            {
                MessageBox(hWnd, L"真棒!说到做到哦~", L"成功", MB_ICONINFORMATION);
                DestroyWindow(hWnd);
            }
            else
            {
                MessageBox(hWnd, L"输入错误!再好好想想~", L"提示", MB_ICONWARNING);
                SetWindowText(hEdit, L"");
                SetFocus(hEdit);
            }
        }
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    return 0;
}

5,当能跑通后,给予正向反馈,并在此基础上加入各种功能

6.但是这样还不够,因为印象不深刻,他远远没有意识到这样的问题,关了程序后刷会短视频又开始打游戏了,怎么办我好心痛呀!!!!豆包你感受到我对舍友的关心和爱了吗,不行。我想在上述能跑通的代码上加一个点开程序后循环播放o泡果奶,输入我以后会好好学习后关闭程序,音乐停止。这样当他在上课中点击后播放音乐,让他脸红心跳,以后不敢上课玩游戏了

cpp 复制代码
#include <Windows.h>
#include <string.h>

#pragma comment(lib, "winmm.lib") // 多媒体库

#define ID_EDIT 1001
#define ID_BUTTON 1002

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

// 循环播放音乐(使用绝对路径)
void PlayMusicLoop() {
    mciSendString(L"close music", NULL, 0, NULL); // 先关闭可能的残留
    // 下面的路径替换成你的音频文件绝对路径!!!
    // 格式:L"你的绝对路径",注意双反斜杠,以及根据格式修改type(mp3用mpegvideo,wav用waveaudio)
    mciSendString(
        L"open \"D:\\Music\\opaonainai.mp3\" type mpegvideo alias music", 
        NULL, 0, NULL
    );
    mciSendString(L"play music repeat", NULL, 0, NULL); // 循环播放
}

// 停止音乐
void StopMusic() {
    mciSendString(L"stop music", NULL, 0, NULL);
    mciSendString(L"close music", NULL, 0, NULL);
}

int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
{
    WNDCLASS wc = { 0 };
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.lpszClassName = L"StudyReminderClass";
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);

    if (!RegisterClass(&wc))
    {
        MessageBox(NULL, L"窗口类注册失败!", L"错误", MB_ICONERROR);
        return 0;
    }

    HWND hWnd = CreateWindow(
        L"StudyReminderClass",
        L"好好学习提醒器",
        WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX,
        CW_USEDEFAULT, CW_USEDEFAULT,
        400, 200,
        NULL, NULL, hInstance, NULL
    );

    if (!hWnd)
    {
        MessageBox(NULL, L"窗口创建失败!", L"错误", MB_ICONERROR);
        return 0;
    }

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    PlayMusicLoop(); // 启动即播放

    MSG msg = { 0 };
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HWND hEdit;
    static HWND hBtn;

    switch (uMsg)
    {
    case WM_CREATE:
        hEdit = CreateWindow(
            L"EDIT",
            L"请输入指定内容才能停止音乐并退出...",
            WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT,
            50, 50, 280, 30,
            hWnd, (HMENU)ID_EDIT,
            ((LPCREATESTRUCT)lParam)->hInstance, NULL
        );

        hBtn = CreateWindow(
            L"BUTTON",
            L"确认",
            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            150, 100, 80, 30,
            hWnd, (HMENU)ID_BUTTON,
            ((LPCREATESTRUCT)lParam)->hInstance, NULL
        );
        break;

    case WM_COMMAND:
        if (LOWORD(wParam) == ID_BUTTON)
        {
            WCHAR inputText[100] = { 0 };
            GetWindowText(hEdit, inputText, 100);

            if (wcscmp(inputText, L"我以后会好好学习") == 0)
            {
                StopMusic();
                MessageBox(hWnd, L"说到做到!下次不许啦~", L"成功", MB_ICONINFORMATION);
                DestroyWindow(hWnd);
            }
            else
            {
                MessageBox(hWnd, L"不对哦~再想想~音乐不会停哦~", L"提示", MB_ICONWARNING);
                SetWindowText(hEdit, L"");
                SetFocus(hEdit);
            }
        }
        break;

    case WM_DESTROY:
        StopMusic();
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    return 0;
}

8.如何在代码中添加启动时窗口自动最大化的功能?

9.加入音量最大:

可以的,豆包。但是他非常狡猾。不仅直接关闭窗口结束程序,还把骂了一顿。骂的很难听,我非常伤心,豆包,能不能把程序升级一下,加一个不能关闭窗口来关闭程序,让音乐一直保持最大声

10豆包可以,是我哥们。但还是把强制最大音量改成每5s自动调音量最大,让他看到音量逐渐小的时候可以放心的时候音量突然最大,打他个措手不及

11.不行呀,音量没有自动调到最大

12.这时候代码的基本功能实现差不多了

可以询问豆包还有什么神奇的点子

我发现豆包有时候也很"坏"呀。

可能有同学问你上述代码的实现需要在对方电脑上提前埋入音频文件,打开程序时调用,

失去突然性,别人一点开就全知道了,少了很多惊喜感。

虽然但是,在主播的实践过程中就算被对方提前知道了,还是会忍不住点开程序中招(无奈╮(╯▽╰)╭)

主包这样做是因为主包之前确实尝试过将音频文件写进程序后进行发送,但是没成。代码跑得通,但是有兼容性问题,发过去打开听不到声音。所以使用这个算是折中之法,等后面学习QT后再说吧。

那么来看看最终效果展示:

随后我们需要将vs右上角的Debug换成release

ctrl+F5进行编译一次,自动生成可执行程序

关闭

最后打开我们代码文件的所在位置

点击realease

后缀为.exe就是我们生成的可执行程序

完结撒花

相关推荐
纵有疾風起2 小时前
【C++—STL】哈希表底层封装与unorderedset/unorderedmap模拟实现
开发语言·数据结构·c++·stl·哈希算法·散列表
coderxiaohan2 小时前
【C++】封装红黑树实现mymap和myset
数据结构·c++·算法
9ilk2 小时前
【C++】--- 类型转换
开发语言·c++
Yupureki2 小时前
《算法竞赛从入门到国奖》算法基础:入门篇-枚举
c语言·数据结构·c++·算法·visual studio
ULTRA??2 小时前
C++两个数组连接类似python的list相加
c++·python
宵时待雨2 小时前
C语言笔记归纳17:数据的存储
c语言·开发语言·笔记
Yupureki2 小时前
《算法竞赛从入门到国奖》算法基础:入门篇-前缀和
c语言·数据结构·c++·算法·1024程序员节
承渊政道2 小时前
C++学习之旅【C++类和对象(中)】
c语言·c++·visual studio
崇山峻岭之间2 小时前
C++ Prime Plus 学习笔记037
c++·笔记·学习