Winapi在屏幕上使用MouseClick活动显示图标

winapi display icon on the screen with mouseclick event

本文关键字:活动 显示 显示图 图标 MouseClick 屏幕 Winapi      更新时间:2023-10-16

在Winapi中,我看到了一种病毒,每当发生鼠标点击事件时(内部有白色X的红色),它在鼠标的X-Y上显示图标。每当我单击鼠标时,如何显示这样的图标?我知道如何使用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;
}

您必须创建自己的始终在顶部窗口才能显示光标。

它可能需要是一个分层窗口,因此您可以使用UpdateLayeredWindow()和32位RGBA位图来使每个光标看起来都正确。

如果您仅使用您控制的特定光标,并且没有Alpha频道,则可以通过在WM_ERASEBKGNDWM_PAINT消息处理程序中绘制图像来节省一些工作,然后使用SetLayeredWindowAttributes(..., LWA_COLORKEY, ...)设置窗口的透明颜色。