c ++ - winapi display ikon på skærmen med mouseclick arrangement

Indlæg af Hanne Mølgaard Plasc

Problem



I WINAPI har jeg set en virus, der viser et ikon på x-y af musen, når der forekommer et museklikshændelse (den røde, der har en hvid X inde). Hvordan viser jeg et ikon sådan, når jeg klikker på musen? Jeg ved, hvordan man laver museklik med setwindowshookex. Er der en funktion som iconshow som jeg har vist nedenfor.


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);
}


Tak


UPDATE


#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;
}

Bedste reference


Du skal oprette dit eget altid-på-top vindue for at vise markøren.


Det skal sandsynligvis være et lagdelt vindue, så du kan bruge UpdateLayeredWindow() og en 32-bit RGBA bitmap for at få alle markører til at se korrekt. [7] [8]


Hvis du kun bruger en bestemt markør du kontrollerer, og den ikke har en alfakanal, kan du spare dig selv ved at male billedet som det er på dit vindue i en WM\_ERASEBKGND eller WM\_PAINT besked handler, og brug derefter SetLayeredWindowAttributes(..., LWA\_COLORKEY, ...) til at indstille vinduets transparensfarve. [9]