Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ winapi在带有鼠标单击事件的屏幕上显示图标_C++_Windows_Winapi - Fatal编程技术网

C++ winapi在带有鼠标单击事件的屏幕上显示图标

C++ winapi在带有鼠标单击事件的屏幕上显示图标,c++,windows,winapi,C++,Windows,Winapi,在WINAPI中,我看到一种病毒,每当鼠标点击事件发生时,它会在鼠标的x-y上显示一个图标(红色的一个,里面有一个白色的x)。当我单击鼠标时,如何显示这样的图标?我知道如何用setwindowshookex钩住鼠标点击。是否有一个像我在下面展示的iconshow这样的函数 HHOOK msHOOK; //getting the icon let's say from a rc file HICON redIcon; msHOOK = SetWindowsHookEx(WH_MOUSE_LL,

在WINAPI中,我看到一种病毒,每当鼠标点击事件发生时,它会在鼠标的x-y上显示一个图标(红色的一个,里面有一个白色的x)。当我单击鼠标时,如何显示这样的图标?我知道如何用setwindowshookex钩住鼠标点击。是否有一个像我在下面展示的iconshow这样的函数

HHOOK msHOOK;
//getting the icon let's say from a rc file
HICON redIcon; 

msHOOK = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, NULL, 0);

LRESULT CALLBACK mouseProc(int nCode, WPARAM wPar, LPARAM lPar){
  IconShow(NULL, redIcon, xofMouse, yofMouse, 0);
  MessageBox(NULL, "Icon showed", "Cap", 0);
  return CallNextHookEx(NULL, nCode, wPar, lPar);
}

while(GetMessage(&msg, NULL, 0, 0) > 0){
  TranslateMessage(&msg);
}
谢谢

更新

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdParam, int iCmdShow){
    HWND wnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
wc.style         = 0;
wc.lpfnWndProc   = WndProc;
wc.cbClsExtra    = 0;
wc.cbWndExtra    = 0;
wc.hInstance     = hInstance;
wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);
wc.lpszMenuName  = NULL;
wc.lpszClassName = "ClassName";
wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
    wnd = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_LAYERED, "ClassName", "ss", NULL, CW_USEDEFAULT, CW_USEDEFAULT, 100, 100, NULL, NULL, NULL, NULL);
    SetLayeredWindowAttributes(wnd, RGB(255, 255, 0), 20, LWA_COLORKEY);
    ShowWindow(wnd, SW_SHOW);
    while (GetMessage(&msg, NULL, 0, 0) > 0) {
        TranslateMessage(&msg);
    }
    return 0;
}


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        case WM_PAINT:
            //stuff here
        break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
#包括
LRESULT回调WndProc(HWND HWND、UINT msg、WPARAM WPARAM、LPARAM LPARAM);
int WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevInstance、PSTR szCmdParam、int iCmdShow){
HWND-wnd;
味精;
WNDCLASSEX wc;
wc.cbSize=sizeof(WNDCLASSEX);
wc.style=0;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(空,IDI_应用程序);
wc.hCursor=LoadCursor(空,IDC_箭头);
wc.hbrBackground=(HBRUSH)(彩色窗口);
wc.lpszMenuName=NULL;
wc.lpszClassName=“ClassName”;
wc.hIconSm=LoadIcon(空,IDI_应用程序);
wnd=CreateWindowEx(WS_-EX_-TOOLWINDOW | WS_-EX_分层,“类名”,“ss”,NULL,CW_-USEDEFAULT,CW_-USEDEFAULT,100,100,NULL,NULL,NULL);
SetLayeredWindowAttributes(wnd、RGB(255、255、0)、20、LWA_颜色键);
展示窗口(西北、西南展示);
while(GetMessage(&msg,NULL,0,0)>0){
翻译信息(&msg);
}
返回0;
}
LRESULT回调WndProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM)
{
开关(msg)
{
案例WM_结束:
窗口(hwnd);
打破
案例WM_销毁:
PostQuitMessage(0);
打破
案例WM_油漆:
//这里的东西
打破
违约:
返回DefWindowProc(hwnd、msg、wParam、lParam);
}
返回0;
}

您必须创建自己的始终位于顶部的窗口来显示光标

它可能需要是一个32位的RGBA位图,这样您就可以使用它来确保每个光标看起来都正确


如果您只使用您控制的特定光标,而它没有alpha通道,则可以通过在
WM_ERASEBKGND
WM_PAINT
消息处理程序中按原样在窗口上绘制图像来节省一些工作,然后使用设置窗口的透明度颜色。

您必须创建自己的始终位于顶部的窗口来显示光标

它可能需要是一个32位的RGBA位图,这样您就可以使用它来确保每个光标看起来都正确



如果您只使用您控制的特定光标,而它没有alpha通道,则可以通过在
WM_ERASEBKGND
WM_PAINT
消息处理程序中按原样在窗口上绘制图像来节省一些工作,然后使用设置窗口的透明度颜色。

如果可以将图像加载为
HCURSOR
而不是
HICON
,请查看Win32 API函数。我已经更新了@remylebeau如果您使用窗口,则不能使用标准的
按钮。您需要一个自定义窗口类(请参见带有处理
WM_ERASEBKGND
WM_PAINT
绘制消息的自定义窗口过程的
RegisterClass()
)。除非您使用
UpdateLayeredWindow()
将位图指定为窗口的整个显示,否则您不需要处理这些消息。谢谢,您是说我应该使用WNDCLASSEX并将类名放在第二个参数中?此外,我没有使用WS_标题,也没有使用WS_边框。这就是我所做的一切,或者等待我会更新它。该死,这很难,程序也会出现在任务栏上,我只是想要一个简单的小img出现,但我喜欢它,因为我知道:)@remylebeau如果你能将你的图像加载为
HCURSOR
,而不是
HICON
,然后看看Win32 API函数。我已经更新了@RemyleBeau。如果你使用一个窗口,你不能使用标准的
按钮
。您需要一个自定义窗口类(请参见带有处理
WM_ERASEBKGND
WM_PAINT
绘制消息的自定义窗口过程的
RegisterClass()
)。除非您使用
UpdateLayeredWindow()
将位图指定为窗口的整个显示,否则您不需要处理这些消息。谢谢,您是说我应该使用WNDCLASSEX并将类名放在第二个参数中?此外,我没有使用WS_标题,也没有使用WS_边框。这就是我所做的一切,或者等待我会更新它。该死,这很难,程序也会出现在任务栏上,我只是想出现一个简单的小img,但我喜欢它,因为我知道:)@remylebeau我已经更新了问题。对不起,我走了这么远,我真的不知道该怎么办。这只显示了一个带有标题栏的空按钮,我不担心它目前处于顶部。如何使其成为图标/光标,以及如何将图标放置在那里。你能做些编辑吗?另外,非常感谢。@turmuka您必须注册一个窗口类,在其中绘制光标,并用您的LWA_颜色键颜色绘制背景。我明白了,我该如何摆脱标题栏@Ander@turmuka:删除窗口的
WS\u标题
样式。您可能还需要删除
WS\u BORDER
样式,但不需要。您的鼠标挂钩将知道何时单击鼠标。单击后,您将该状态保存到某个位置,并在窗口上调用Invalidate,在WM_PAINT中,您使用保存的状态决定要绘制的内容。我已更新了问题。对不起,我走了这么远,我真的不知道该怎么办。这只显示了一个带有标题栏的空按钮,我不担心它目前处于顶部。如何使其成为图标/光标,以及如何将图标放置在那里。你能做些编辑吗?另外,非常感谢。@turmuka您必须注册一个窗口类,在其中绘制光标,并用您的LWA_颜色键颜色绘制背景。我明白了,我该如何摆脱标题栏@Ander@turmuka:移开窗户