2017-10-04 17 views
0

WINAPIでは、マウスのクリックイベントが発生するたびにマウスのx-yにアイコンを表示するウィルスを発見しました。マウスをクリックするたびにそのようなアイコンを表示するにはどうすればよいですか?私はsetwindowshookexでマウスクリックをフックする方法を知っています。下に示したアイコンショーのような機能はありますか?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

イメージを 'HICON'ではなく' HCURSOR'として読み込むことができる場合は、Win32 API ['SetCursor()'](https://msdn.microsoft.com/en-us/library)を見てください。 /windows/desktop/ms648393.aspx)関数を呼び出します。 –

+0

@RemyLebeau – turmuka

+1

を更新しましたウィンドウをまったく使用している場合は、標準の 'BUTTON'を使用することはできません。 'WM_ERASEBKGND'と' WM_PAINT'ペイントメッセージを扱うカスタムウィンドウプロシージャを持つカスタムウィンドウクラス( 'RegisterClass()'参照)が必要です。 'UpdateLayeredWindow()'を使ってビットマップをウィンドウ全体の表示に割り当てるのでない限り、それらのメッセージを処理する必要はありません。 –

答えて

2

あなたは、カーソルを表示するには、独自の最前面ウィンドウを作成する必要があります。

UpdateLayeredWindow()と32ビットRGBAビットマップを使用すると、すべてのカーソルが正しく見えるようになるため、おそらくlayered windowにする必要があります。

制御している特定のカーソルのみを使用していて、アルファチャンネルがない場合は、そのままメッセージをWM_ERASEBKGNDまたはWM_PAINTメッセージハンドラのウィンドウにペイントして保存することができます。 SetLayeredWindowAttributes(..., LWA_COLORKEY, ...)を使用してウィンドウの透過色を設定します。

+0

私は質問を更新しました。私はこれを遠くに残して、申し訳ありません、私は本当にこれにnoobです。これは、タイトルバーを持つ空のボタンを表示するだけです、私はそれが一番上にあることを心配していません。どのように私はそれをアイコン/カーソルにするのですか、どのようにアイコンを置くのですか?あなたはいくつかの編集をしてくださいできますか?また、ありがとうございました。 – 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

関連する問題