2017-10-04 96 views
0

在WINAPI中,我看到一種病毒,只要發生鼠標單擊事件(紅色內部有白色X),就會在鼠標的x-y上顯示一個圖標。每當我點擊鼠標時,如何顯示這樣的圖標?我知道如何用setwindowshookex掛鉤鼠標點擊。是否有像iconshow這樣的功能,如下所示。winapi在鼠標點擊事件的屏幕上顯示圖標

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

感謝

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; 
} 
+0

如果您可以將圖像加載爲'HCURSOR'而不是'HICON',請查看Win32 API ['SetCursor()'](https://msdn.microsoft.com/en-us/library /windows/desktop/ms648393.aspx)函數。 –

+0

我已更新@RemyLebeau – turmuka

+1

如果您使用窗口,則無法使用標準的'BUTTON'。你需要一個自定義的窗口類(參見'RegisterClass()')和一個自定義窗口過程來處理'WM_ERASEBKGND'和'WM_PAINT'畫圖消息。除非使用'UpdateLayeredWindow()'將窗口的整個顯示分配給位圖,否則不需要處理這些消息。 –

回答

2

你必須創建自己始終位於頂層的窗口顯示光標。

它可能需要是layered window,因此您可以使用UpdateLayeredWindow()和32位RGBA位圖來使每個光標看起來正確。

如果您只使用您控制的特定光標,並且它沒有Alpha通道,您可以通過將圖像按原樣繪製到窗口中的WM_ERASEBKGNDWM_PAINT消息處理程序,然後使用SetLayeredWindowAttributes(..., LWA_COLORKEY, ...)來設置窗口的透明度顏色。

+0

我已經更新了這個問題。我很抱歉,我得到了這一點,我真的很喜歡這個。這隻顯示一個帶有標題欄的空按鈕,我並不擔心它現在處於頂端。我如何使它成爲圖標/光標,以及如何將圖標放在那裏。你可以做一些編輯嗎?另外,非常感謝。 – turmuka

+1

@turmuka您必須註冊一個窗口類並在[WM_PAINT](https://msdn.microsoft.com/en-us/library/windows/desktop/dd162487(v = vs.85).aspx)中繪製光標。並用您的LWA_COLORKEY顏色繪製背景。 – Anders

+0

我看,我如何擺脫標題欄? @Ander – turmuka