Win32学习笔记(16)消息类型

2023-10-26

1.消息的产生与处理流程:

如上图,我们在创建窗口程序中详细介绍了这张图。比如,我们点击某个窗口的时候就会产生消息,操作系统会先判断这个消息是点在了哪个窗口,找到窗口后,会根据窗口对象中的一个成员找到窗口是属于哪个线程的。找到后就会把他封装好的消息放到一个结构体中,然后存到消息队列中,那么我们的GetMessage()就会不停地把消息队列中的消息取出。

在之前我们创建窗口程序的代码中有(我是截取的)

MSG msg;
GetMessage(&msg, NULL, 0, 0)

我们知道取出的消息放到了msg中.我们转到定义看看MSG

注意:能产生消息的四种情况:1.鼠标 2.键盘 3.其他应用程序 4.操作系统的内核程序

那么这么多消息操作系统怎么处理呢?操作系统会把他们分成不同类别,每种不同的消息给他们一个唯一的编号。下面介绍参数

UINT        message
这个参数是UINT型,它给每个消息类型一个编号,比如我点一下鼠标就会有个唯一类型的编号。
HWND        hwnd
句柄,消息是基于窗口的,任何消息都是某一个窗口的消息。
WPARAM      wParam;
LPARAM      lParam;
这两个成员是描述你的消息是什么样的
DWORD       time
消息什么时候产生的
POINT       pt
你的消息什么位置产生的

那么我们取出消息放到msg中为什么不直接处理呢?其实之前的学习中我们也提过了。现在我们再看一下MSG,通过我们只能知道,是哪个窗口什么类型的。我们得到的仅仅是一个索引,我们不知道窗口回调也就是窗口处理函数是什么,所以把得到的message传给DispatchMessage()它拿着消息和HWND,进入内核,内核会根据句柄找到窗口对象找到窗口处理函数,再由内核发起调用执行窗口过程(处理)函数。

经过上面的介绍我们现在知道消息处理函数中的四个参数是从哪里来的了。

这是窗口过程的四个参数 
    _In_ HWND   hwnd,
    _In_ UINT   uMsg,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam

我们通过GetMessage得到消息,这四个参数全在MSG中,然后把MSG(消息)通过DispatchMessage()传到内核,内核在调用窗口过程的时候又会把这四个参数传回来(详细可看最上面的那张图).所以窗口过程函数中的四个参数就是MSG中的四个成员。

那么我们尝试输出消息类型(就是MSG中的第二个参数)那么我们输出WindowProc中的uMSG即可。示例代码如下

#include "framework.h"
#include "WindowsProject1.h"
LRESULT CALLBACK WindowProc(
    _In_ HWND   hwnd,
    _In_ UINT   uMsg,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam
)
{
    char szOutBuff[0x80];
    sprintf(szOutBuff, "消息类型: %x \n", uMsg);
    OutputDebugStringA(szOutBuff);
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR    lpCmdLine,
    _In_ int       nCmdShow)
{
    char szOutBuff[0x80];
    //1.第一步:定义你的窗口是什么样的
    TCHAR className[] = TEXT("My First Window");
    WNDCLASS wndclass = { 0 };
    wndclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
    wndclass.lpszClassName = className;
    wndclass.hInstance = hInstance;
    wndclass.lpfnWndProc = WindowProc;//不是调用函数,只是告诉函数名操作系统会来调用
    RegisterClass(&wndclass);
    //第二部:创建并显示窗口
    HWND hwnd = CreateWindow(
        className,
        TEXT("我的第一个窗口"),
        WS_OVERLAPPEDWINDOW,
        10,
        10,
        600,
        300,
        NULL,
        NULL,
        hInstance,
        NULL
    );
    if (hwnd == NULL)
    {
        sprintf(szOutBuff, "Error:%d", GetLastError());
        OutputDebugStringA(szOutBuff);
        return 0;
    }
    ShowWindow(hwnd, SW_SHOW);
    //3.第三步:接收消息并处理
    MSG msg;
    BOOL bRet;
​
    while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
    {
        if (bRet == -1)
        {
            // handle the error and possibly exit
        }
        else
        {
            //转换消息
            //TranslateMessage(&msg);
            DispatchMessage(&msg);//分发消息
        }
    }
    return 0;
}
 

我们通过Debugview++看到输出:

我们可以看到有很多消息(还有很多没有截图),不要认为只有鼠标或者键盘点的时候才有消息,我们的内核程序在执行的时候就已经有消息了。我们可以具体查看一下这些消息类型比如说上面的消息类型:1。我们在VS2019(我用的2019)中把MSG转到定义看一下他是数以一个

文件的,我们就在里面找

找到了,那么这个消息类型是什么意思呢?我们用官方文档查询。

WM_CREATE消息:
当应用程序请求通过调用CreateWindowEx或CreateWindow函数创建窗口时发送。(在函数返回之前发送消息。新窗口的窗口过程在创建窗口后,但在窗口变为可见之前接收此消息。
​
窗口通过其WindowProc函数接收此消息。

简单来说就是我们的窗口一创建的时候操作系统产生一个消息,这个消息类型就是WM_CREATE.有很多消息类型,这些消息类型对应一个编码,当我们需要的时候我们可以利用,我们不需要的时候就可以不用理会。

比如:当窗口最大化的时候会有一个消息类型,如果我们想要在最大化
的时候做些什么就可以判断,如果产生这个值那么怎样怎样。

总而言之我们应该知道消息是时刻产生的,鼠标可以产生、键盘可以产生、别的程序可以产生等等。


不过有一些重要的消息类型我们应该去知道并加以利用。就比如我们在执行之前的代码的时候关掉窗口再次执行可能会报错。

可能大家之前写程序的时候也遇到过这个错误,原因就是你之前打开的程序并没有真正关闭,我们需要在任务管理器中终止程序才能进行。我们也发现当我们执行上面给的代码,关闭窗口后仍可以在任务管理器中找到这个程序。

所以只是窗口没了,程序还在跑。那么怎么解决呢?我们就可以利用消息类型捕捉这个关闭窗口的消息,判断是否产生这个消息再通过代码来终止这个程序。

我们知道每个消息类型都对应一种编号

这个2就对应关闭窗口。其实我们从英文意思就可以看出3是移动窗口,5是改变大小。前面WM就是Windows和Message的意思。

通常我们用switch语句来写,我们可以用PostQuitMessage()函数退出程序

void PostQuitMessage(
  [in] int nExitCode//填0
);

示例代码如下

#include "framework.h"
#include "WindowsProject1.h"
LRESULT CALLBACK WindowProc(
    _In_ HWND   hwnd,
    _In_ UINT   uMsg,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam
)
{
    switch (uMsg)//这里就是对消息类型的捕捉,如果是关闭窗口的话就会终止程序,如果是其他操作的话没有影响
    {
    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR    lpCmdLine,
    _In_ int       nCmdShow)
{
    char szOutBuff[0x80];
    //1.第一步:定义你的窗口是什么样的
    TCHAR className[] = TEXT("My First Window");
    WNDCLASS wndclass = { 0 };
    wndclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
    wndclass.lpszClassName = className;
    wndclass.hInstance = hInstance;
    wndclass.lpfnWndProc = WindowProc;//不是调用函数,只是告诉函数名操作系统会来调用
    RegisterClass(&wndclass);
    //第二部:创建并显示窗口
    HWND hwnd = CreateWindow(
        className,
        TEXT("我的第一个窗口"),
        WS_OVERLAPPEDWINDOW,
        10,
        10,
        600,
        300,
        NULL,
        NULL,
        hInstance,
        NULL
    );
    if (hwnd == NULL)
    {
        sprintf(szOutBuff, "Error:%d", GetLastError());
        OutputDebugStringA(szOutBuff);
        return 0;
    }
    ShowWindow(hwnd, SW_SHOW);
    //3.第三步:接收消息并处理
    MSG msg;
    BOOL bRet;
​
    while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
    {
        if (bRet == -1)
        {
            // handle the error and possibly exit
        }
        else
        {
            //转换消息
            //TranslateMessage(&msg);
            DispatchMessage(&msg);//分发消息
        }
    }
    
​
​
    return 0;
}
​

输出

 

当我们关闭窗口的时候我们可以在任务管理器中找一下发现找不到这个程序了,也就是说在我们关闭窗口的时候这个程序也终止了。


再比如我们想要接受一个键盘消息,比如当我们按下A的时候把A打印出来怎么做呢?

如上图,键盘按下去产生的消息就叫KEYDOWN,弹起来就叫KEYUP。同理我们放入switch语句中

代码如下(其他地方不用修改只用修改WindowProc,所以其他代码就不复制了)

LRESULT CALLBACK WindowProc(
    _In_ HWND   hwnd,
    _In_ UINT   uMsg,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam
)
{
    switch (uMsg)
    {
    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }
    case WM_KEYDOWN:
    {
        MessageBox(0,0,0,0);//先不设置,我们看下效果
        return 0;
    }
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

但我们按下键盘输出:

如图我们现在已经可以捕捉键盘按下的消息了。现在我们希望按下键盘知道按的是谁。我们查下官方文档

LRESULT CALLBACK WindowProc(
  HWND  hwnd,        
  WM_IME_KEYDOWN,  
  WPARAM wParam, 
  LPARAM lParam      
);

我们知道WindowProc()中的第二个参数MSG只是消息类型,它并不能知道我们按下的是哪个键,这时就要用到第三个和第四个参数了。

wParam
非系统键的虚拟键代码。

这个参数就是说每个键都对应一个虚拟码。我们把这个虚拟码打印出来(就改一部分):

LRESULT CALLBACK WindowProc(
    _In_ HWND   hwnd,
    _In_ UINT   uMsg,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam
)
{
    switch (uMsg)
    {
    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }
    case WM_KEYDOWN:
    {
        char szOutBuff[0x80];
        sprintf(szOutBuff, "消息: %x - %x \n", uMsg, wParam);//第一个打印消息类型,第二个打印虚拟码
        OutputDebugStringA(szOutBuff);
        return 0;
    }
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

输出:

如图我们按下A键,第一个100指的是消息类型(KEYDOWN)第二个是A十六进制是41十进制是65也就是ASCII码对应的A。

我们再试试第四个参数,lParam:

这是什么意思呢,我们先打印出来看看。

LRESULT CALLBACK WindowProc(
    _In_ HWND   hwnd,
    _In_ UINT   uMsg,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam
)
{
    switch (uMsg)
    {
    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }
    case WM_KEYDOWN:
    {
        char szOutBuff[0x80];
        sprintf(szOutBuff, "消息: %x - %x -%x \n", uMsg, wParam,lParam);
        OutputDebugStringA(szOutBuff);
        return 0;
    }
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
 

输出:

其实这个就是一个32位数来表示各种信息,每个位数表示的信息就对应上面那张图。比如第30位就是如果你之前就是按着键盘的(我按住A了)那就是1如果没按就是0.比如这个401e0001拆开就是

0100 0000 0001 1110 0000 0000 0000 0001
左边第二个数就是第30位是1就说明是按着的。

这个200001

0000 0000 0010 0000 0000 0000 0000 0001
左边第二个数是0说明没按着

我们每个类型的消息都有wParam和lParam这两个参数,这两个参数的含义是由消息类型决定的,不同的消息类型不一样。

比如:这两个参数在KEYDOWN中有用,可是在DESTROY(关闭窗口)中没有。看下官方文档

 

可以看到不使用这两个参数。


接着上面的问题,我们想要按一个键就输出一个,虽然上面输出了对应的虚拟码但是还不够完美我们想要直接输出按的键怎么办呢?我们这时就不用KEYDOWN而是用CHAR这个用来接收键盘上的字符消息。看下官方文档

这个对应的就是字符了。示例代码

LRESULT CALLBACK WindowProc(
    _In_ HWND   hwnd,
    _In_ UINT   uMsg,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam
)
{
    switch (uMsg)
    {
    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }
    case WM_CHAR:
    {
        char szOutBuff[0x80];
        sprintf(szOutBuff, "消息: %c \n", wParam);//这里打印
        OutputDebugStringA(szOutBuff);
        return 0;
    }
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

我们这样写发现我们按键盘并不会输出消息,因为这里我们还需要用到TranslateMessage()(之前我屏蔽了这个代码)

将虚拟键消息转换为字符消息。
BOOL TranslateMessage(
  [in] const MSG *lpMsg
);

这个函数使用来转换消息的,如果不转换我们就得不到字符。它所干的就是把按键盘得到的虚拟码转换成字符,

示例代码如下:

#include "framework.h"
#include "WindowsProject1.h"
LRESULT CALLBACK WindowProc(
    _In_ HWND   hwnd,
    _In_ UINT   uMsg,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam
)
{
    switch (uMsg)
    {
    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }
    case WM_CHAR:
    {
        char szOutBuff[0x80];
        sprintf(szOutBuff, "消息: %c \n", wParam);
        OutputDebugStringA(szOutBuff);
        return 0;
    }
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR    lpCmdLine,
    _In_ int       nCmdShow)
{
    char szOutBuff[0x80];
    //1.第一步:定义你的窗口是什么样的
    TCHAR className[] = TEXT("My First Window");
    WNDCLASS wndclass = { 0 };
    wndclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
    wndclass.lpszClassName = className;
    wndclass.hInstance = hInstance;
    wndclass.lpfnWndProc = WindowProc;//不是调用函数,只是告诉函数名操作系统会来调用
    RegisterClass(&wndclass);
    //第二部:创建并显示窗口
    HWND hwnd = CreateWindow(
        className,
        TEXT("我的第一个窗口"),
        WS_OVERLAPPEDWINDOW,
        10,
        10,
        600,
        300,
        NULL,
        NULL,
        hInstance,
        NULL
    );
    if (hwnd == NULL)
    {
        sprintf(szOutBuff, "Error:%d", GetLastError());
        OutputDebugStringA(szOutBuff);
        return 0;
    }
    ShowWindow(hwnd, SW_SHOW);
    //3.第三步:接收消息并处理
    MSG msg;
    BOOL bRet;
​
    while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
    {
        if (bRet == -1)
        {
            // handle the error and possibly exit
        }
        else
        {
            //*****转换消息******//
            TranslateMessage(&msg);
            DispatchMessage(&msg);//分发消息
        }
    }
    return 0;
}

输出:

成功了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Win32学习笔记(16)消息类型 的相关文章

  • 在c#中将金额转换为单词格式的卢比和佩斯

    我有 Windows 应用程序 需要将文本框中输入的金额转换为卢比和派斯格式的单词 例如我的金额是2356 54那么它应该显示two thousand three hundred fifty six ruppes and fifty fou
  • Windows 服务恢复未重新启动服务

    我将 Windows 服务的恢复配置为在失败后延迟一分钟重新启动 但我从未真正重新启动服务 即使有最明显的错误 我确实在事件查看器中收到一条消息 无法在源 MyApp exe 中找到事件 ID 1 的描述 本地计算机可能没有必要的注册表信息
  • 为 Windows 7 构建自定义凭据提供程序

    在查看了为 Windows 7 构建自定义凭据提供程序的代码后 我设法让自己的磁贴显示在登录屏幕上 并且可以作为所需用户登录 但是 我正在尝试实现一个系统 其中事件 范围内的蓝牙设备 触发登录 解锁 而无需单击磁贴 我可以设置它自动填写密码
  • cygwin + Windows套接字编程

    我正在尝试学习 Windows 中的 Socket 编程 并使用 cygwin 来实现同样的目的 我发现所需的文件位于 usr include w32api 我从网上获取了一个示例程序并尝试编译但无法这样做 相同的代码是 include
  • Windows 上的 Jenkins 与 Docker - 无法运行程序“nohup”

    我正在使用Jenkins Azure VM 代理插件 https plugins jenkins io azure vm agents与 Linux Master 一起在 Windows 代理上启动作业 我已经完成了所有配置步骤 一切正常
  • 使用 Python 的 Windows 桌面 GUI 自动化 - 睡眠与紧密循环

    我正在使用 Python 的 PyAutoGUI 库来自动化 GUI 在当前窗口上完成数据输入后 我正在自动化的应用程序会打开一个新窗口 一切都由 python 自动化处理 当前窗口中的数据输入以及打开窗口所需的单击 在当前窗口中执行单击时
  • ReadFile() 可能有超时吗?

    while GetExitCodeProcess processInfo hProcess exitCode exitCode STILL ACTIVE ReadFile defaultSTDIN chBuf 1 dwRead 0 Writ
  • 使用 strcpy_s 作为 TCHAR 指针(Microsoft 特定)

    我想知道哪个是正确的方法 tcscpy tchar pointer tcslen tchar pointer T Hello World or tcscpy tchar pointer tcsclen tchar pointer T Hel
  • 如何将参数传递给 DLL 初始化(例如,通过 LoadLibrary 加载时)?

    如何将参数传递给通过 LoadLibrary 加载的 DLL 的初始化函数 有可能吗 也就是说 无需求助于某种导出函数或共享内存 没有直接的方法 最简单的可能是通过环境变量 它们可以在调用之前轻松设置LoadLibray with sete
  • 一个 Node.js 集群可以在 64 位 Wintel PC 上生成多少个子进程?

    我正在运行并发测试 为了简洁起见 为每个欺骗的 http 请求定义了一个进程 对于最多 64 个请求 进程 它工作得很好 但在 65 个请求 进程上就折叠起来了 我在一台 I5 笔记本电脑上运行 Window 7 64 位 具有 4GB R
  • Powershell添加系统变量

    我正在尝试使用 PowerShell 在此处添加系统变量 我已经尝试过两种方式使用 env MyTestVariable My test variable and Environment SetEnvironmentVariable Tes
  • 如何在 C++ 中更改活动桌面壁纸

    你好 我想写一个小程序来更改 Windows 7 中的壁纸 我想使用以下代码 include windows h include wininet h include shlobj h include wchar h include
  • Python - PIP 安装故障排除 - PermissionError: [WinError 5] 访问被拒绝

    使用 PIP 安装新软件包甚至将 pip 本身升级到最新版本时出现以下错误 我正在 Windows 8 1 机器上使用 Python 3 4 运行 pip 该消息告诉我我没有文件的管理权限 我的帐户是管理员帐户 我很感激任何关于如何解决这个
  • 检测windows上的核心数

    如果我在 Linux 或 Mac 上运行 R 我可以使用以下命令检测可用内核的数量multicore detectCores 但是 没有 Windows 版本的多核功能 因此我无法在 Windows 上使用此技术 如何从 R 中以编程方式检
  • C# Winforms 不规则的 Windows [重复]

    这个问题在这里已经有答案了 如何使用 WinForms 和 C 创建不规则形状的窗口 有几种不同的方法可以实现这一目标 一是用用TransparencyKey 正如尼夫勒在帖子中指出的那样 另一种是分配一个Region http msdn
  • 如何获取Windows 7中的“临时文件夹”?

    在 Windows 7 中 如何以编程方式获取系统临时文件夹 The 获取临时路径 http msdn microsoft com en us library windows desktop aa364992 28v vs 85 29 as
  • 如何在 Windows 中拦截 DNS 查询

    我正在研究如何在 Windows 中拦截 DNS 查询 以一种不需要将 DLL 注入到每个进程中的方式 并且理想情况下能够根据发出查询的进程做出决策 因此简单的 DNS 代理服务器是不够的 从表面上看 DNS 查询所采用的路径如下所示 某些
  • 如何保证清理代码在 Windows C++ 中运行(SIGINT、错误分配和关闭窗口)

    我有一个 Windows C 控制台程序 如果我不调用ReleaseDriver 在我的程序结束时 某些硬件会进入错误状态 并且在不重新启动的情况下无法再次使用 我想确定一下ReleaseDriver 即使程序异常退出 例如如果我点击Ctr
  • Node npm windows 文件路径太长,无法安装包

    情况 我想在Windows托管的开发环境中使用gulp和相关的前端工具链 我在尝试使用 Browser Sync 之类的 gulp 插件时遇到了困难 因为 node modules 文件夹图呈扇形分布 使得 Windows 文件路径太长而无
  • 无法安装 Visual Studio C++ 包含文件“excpt.h”

    我正在尝试编译一个 Visual Studio C 项目 但由于编译器报告 无法打开包含文件 excpt h 没有这样的文件或目录 我无法到达任何地方 该问题已在互联网上多次报告 但我找不到有关我的具体情况的任何帮助 问题不在于项目的包含路

随机推荐

  • java连接数据库的Connection中的prepareStatement与createStatement的区别

    这两者的区别主要在于如何构造执行sql语句的对象 1 对于prepareStatement来说 其执行返回的是一个prepareStatement对象 而这个方法的描述是这样的 prepareStatement String sql 创建一
  • 在mac上安装gradle(超详细,直接按步骤操作即可轻松搞定)

    在mac上安装gradle 超详细 直接按步骤操作即可轻松搞定 第一步 就是先download最新版本的gradle 网址如下 http gradle org gradle download 然后将下载下来的zip包放解压到本地任意的路径上
  • input 标签里 value值从数据库读取出来的值显示一半或者没显示原因

    存进数据库的字符如下 读取数据出来显示如下 毒 这家超市被星巴克称为 价格警察 这段话没显示出来 原因 这样出来的是value 比海底捞服务更 毒 这家超市被星巴克称为 价格警察 input value值中的双引号被作为value值的结束符
  • 求二元函数最大值matlab,利用matlab, 二元函数求最大值

    求二元函数 z 0 2323 x 2 0 2866 2 2 0 5406 a0 2 1 0203 a0 2 x 2 x 2 y 2 0 5 tanh 2 x 2 y 2 0 5 x 2 0 5733 u0 2 的最大值 变量x和y都是在0
  • React -css in js框架style-components

    原文 https www jianshu com p 27788be90605 前言 前端飞一般的发展中 衍生出各式各样的框架 框架的目的是减轻开发人员的开发难度 提高效率 以前网页开发的原则是关注点分离 意思是各种技术只负责自己的领域 不
  • 【偷偷卷死小伙伴Pytorch20天-day16-损失函数】

    最近这几天忙着开学返校的事情 终于几番周折回到了学校 继续pytorch的学习打卡 一般来说 监督学习的目标函数由损失函数和正则化项组成 Objective Loss Regularization Pytorch中的损失函数一般在训练模型时
  • 服务器 文件类型,linux服务器支持的文件类型

    linux服务器支持的文件类型 内容精选 换一换 弹性云服务器卸载磁盘 弹性云服务器状态为stopped时支持系统盘 也就是 dev sda挂载点 和用户盘的卸载 没有操作系统限制 也不需要在弹性云服务器内部安装vmtools 弹性云服务器
  • 【深度解析→博文总结】李宏毅机器学习2023作业01Regression(COVID-19 Cases Prediction)

    文章目录 系列文章 简要说明 视频分享 作业详情 调参记录 Simple Baseline 1 96993 Medium Baseline 1 15678 Strong Baseline 0 92619 Boss Baseline 0 81
  • Seata1.2.0配置及分布式事务失效解决

    配置 版本说明 springCloud Alibaba组件版本关系 我用的是 cloud Alibaba 2 2 1 RELEASE springboot 2 2 5 RELEASE nacos 1 2 1 seata1 2 0 1 配置数
  • booth算法

    booth算法 1 booth算法定义 2 二进制乘法过程 3 二进制乘法转换成 booth乘法运算 4 Radix 2 Booth乘法器 5 Radix 4 Booth乘法器 6 Booth乘法器计算实例 1 booth算法定义 将乘数看
  • 【CV】图像分类中的细粒度/粗粒度怎么理解

    粗粒度图像分类 类别之间差异大 比如人 汽车 树 细粒度图像分类 类别之间差异小 比如200种鸟的分类 100种花的分类 由于细粒度类别属于同一个大类 所以各类别之间的差距很小 这些细微的差距容易被光照 颜色 背景 形状和位置等变化因素覆盖
  • Python作图——numpy库和matplotlib库

    一 numpy库 1 1概述 numpy是一个存储和处理多维数组 矩阵等的库 提供多种关于数组运算的数学函数 可供直接调用 1 1 1数据类型 numpy的数据类型包括整型 浮点型 复数型 布尔型等 在IDLE查询numpy支持的数据类型
  • MATLAB .dat读、存及简单处理

    文章目录 0 前言 1 思路 2 MATLAB 3 结语 0 前言 近期接触到二进制文件 dat 写一个简单的教程 假设文件内容为连续的通信数据 含有不符合的数据 对其进行简单剔除 1 思路 假设输入 dat文件共有3个整帧数据 每帧长度5
  • 机器学习(归一化、去中心化、标准化)

    为什么要进行数据的预处理 这需要分两种情况说明 1 数据数值很大 2 数据数值很小 1 首先 对于一个数值非常之大的特征 T 若其数值非常之大 区间也非常之大 例如区间范围为 10 10 10 20 以线性拟合函数举例 显然我们在进行机器学
  • Android:JNI调用C++自定义类的详细方法

    一般情况下 我们都是用 JNI 调用 C 的某个方法的代码 包括直接使用 android studio 生成的代码也是如此 但有时我们需要新建 或者得到的是 C 的一个自定义类 在调用时就不能像调用 C 方法那样了 查阅了一部分其他人的博客
  • 学习笔记五:电路设计需要注意的那些事

    注意One part 电路中电源VBAT须要先经过滤波电容再到芯片的VBAT引脚 芯片时钟端走线尽量不要靠近电源走线 避免对电源走线产生纹波的干扰 需要隔离地处理 天线走50欧姆的阻抗设计 走线两侧距离30mil处添加过孔 最好用第三层GN
  • Adobe MAX 2020:最新版Photoshop提供AI智能神经滤镜及天空替换等功能

    数据猿年度重磅活动预告 2020年度金猿策划活动 金猿榜单发布 金猿奖杯颁发 即将推出 尽情咨询期待 大数据产业创新服务媒体 聚焦数据 改变商业 数据报道 受新冠疫情影响 今年的Adobe MAX 2020 于北京时间10月21日改为了线上
  • 一个优秀的程序员真的能顶10个普通的程序员吗?

    一个优秀的程序员真的能顶10个普通的程序员吗 一 前言 优秀的程序员 比糟糕的程序员的工作产出高100倍 二 糟糕程序员会有哪些表现 1 无法对代码进行推理 2 没有补救措施 3 代码难以改动 三 优秀程序员是怎么做的呢 1 先进行实验是他
  • Java+SSM+Vue 毕业设计 游戏攻略资讯补丁售卖商城(含源码+论文)

    文章目录 1 项目简介 2 实现效果 2 1 界面展示 3 设计方案 3 1 概述 3 2 系统流程 3 3 系统结构设计 4 项目获取 1 项目简介 Hi 各位同学好呀 这里是M学姐 今天向大家分享一个今年 2022 最新完成的毕业设计项
  • Win32学习笔记(16)消息类型

    1 消息的产生与处理流程 如上图 我们在创建窗口程序中详细介绍了这张图 比如 我们点击某个窗口的时候就会产生消息 操作系统会先判断这个消息是点在了哪个窗口 找到窗口后 会根据窗口对象中的一个成员找到窗口是属于哪个线程的 找到后就会把他封装好