2012-09-29 73 views
1

我正在寫一個非常簡單的程序,它打印所選像素的顏色。 這裏是我的代碼:ANSI C&WinAPI:如何從鉤子程序獲取窗口句柄?

#include <windows.h> 
#include <stdio.h> 
#include <stdlib.h> 
#define UNICODE 

LRESULT CALLBACK mouse_hook_low_level(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if(wParam == WM_MOUSEMOVE) { 
     //Need to get a handle to the window! 
     InvalidateRect(window, NULL, FALSE); 
     UpdateWindow(window); 
    } 
    return CallNextHookEx(NULL, nCode, wParam, lParam); 
} 

LRESULT CALLBACK window_process(HWND window, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    HDC dc = GetDC(NULL); 
    HDC hdc; 
    HFONT font; 
    PAINTSTRUCT ps; 
    int r, g, b; 
    POINT p; 
    RECT background_rect, color_rect; 
    wchar_t buffer[256]; 

    switch(message) { 
     case WM_PAINT: 
      GetCursorPos(&p); 
      r = GetRValue(GetPixel(dc, p.x, p.y)); 
      g = GetGValue(GetPixel(dc, p.x, p.y)); 
      b = GetBValue(GetPixel(dc, p.x, p.y)); 
      hdc = BeginPaint(window, &ps); 
      background_rect.left = 0; 
      background_rect.right = 199; 
      background_rect.top = 0; 
      background_rect.bottom = 99; 
      FillRect(hdc, &background_rect, (HBRUSH)(COLOR_WINDOW+1)); 
      font = CreateFont(
       14, 
       0, 
       0, 
       0, 
       FW_DONTCARE, 
       FALSE, 
       FALSE, 
       FALSE, 
       DEFAULT_CHARSET, 
       OUT_OUTLINE_PRECIS, 
       CLIP_DEFAULT_PRECIS, 
       CLEARTYPE_QUALITY, 
       VARIABLE_PITCH, 
       TEXT("Times New Roman") 
      ); 
      SelectObject(hdc, font); 
      swprintf_s(buffer, 256, L"Coordinates: (%d, %d)", p.x, p.y); 
      TextOut(hdc, 70, 10, buffer, wcslen(buffer)); 
      swprintf_s(buffer, 256, L"RGB: (%d, %d, %d)", r, g, b); 
      TextOut(hdc, 70, 40, buffer, wcslen(buffer)); 
      color_rect.left = 10; 
      color_rect.right = 60; 
      color_rect.top = 10; 
      color_rect.bottom = 60; 
      FillRect(hdc, &color_rect, (HBRUSH)CreateSolidBrush(RGB(r, g, b))); 
      EndPaint(window, &ps); 
      break; 
     case WM_CLOSE: 
      DestroyWindow(window); 
      break; 
     case WM_DESTROY: 
      PostQuitMessage(0); 
      break; 
     default: 
      ReleaseDC(window, hdc); 
      return DefWindowProc(window, message, wParam, lParam); 
    } 
    ReleaseDC(window, hdc); 
    return 0; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    LPCWSTR class_name = L"name"; 
    MSG message; 
    WNDCLASSEX window_class; 
    HWND window; 
    HHOOK MouseHook; 

    window_class.cbSize = sizeof(WNDCLASSEX); 
    window_class.style = CS_HREDRAW | CS_VREDRAW; 
    window_class.lpfnWndProc = window_process; 
    window_class.cbClsExtra = 0; 
    window_class.cbWndExtra = 0; 
    window_class.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    window_class.hCursor = LoadCursor(NULL, IDC_ARROW); 
    window_class.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
    window_class.lpszMenuName = NULL; 
    window_class.lpszClassName = class_name; 
    window_class.hInstance = hInstance; 
    window_class.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 
    RegisterClassEx(&window_class); 
    window = CreateWindow(
     class_name, 
     L"Pixel color", 
     WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU, 
     CW_USEDEFAULT, 
     CW_USEDEFAULT, 
     200, 
     100, 
     NULL, 
     NULL, 
     hInstance, 
     NULL 
    ); 
    ShowWindow(window, SW_SHOWNORMAL); 
    MouseHook = SetWindowsHookEx(WH_MOUSE_LL, mouse_hook_low_level, hInstance, 0); 
    while(GetMessage(&message, NULL, 0, 0)) { 
     TranslateMessage(&message); 
     DispatchMessage(&message); 
    } 
    UnhookWindowsHookEx(MouseHook); 
    return message.wParam; 
} 

的問題是:我怎麼能在9號線得到一個處理窗口在鉤子程序進一步窗口更新?你能說一般關於我的代碼的東西嗎?我是一名學生,有一點C程序設計經驗,你能指出我的錯誤嗎?

在此先感謝。

+1

您可以使用'FindWindow'或更全局地存儲窗口句柄。 – chris

+0

但是使用全局變量不是不好的做法嗎?無論如何,這是有益的答案,謝謝。 –

+1

儘可能避免使用它們。我不確定C中是否有更好的存儲解決方案,但是如果您每次都需要確切的窗口,則需要類似的東西。另一種可能性是在你的類名和標題中使用'FindWindow',但儘管不太可能,但它可能會用相同的信息獲取另一個信息,或者另一個應用程序可能會更改標題。 – chris

回答

1

首先,嘗試WindowFromPoint。如果它沒有找到一個窗口,即它不是你的進程窗口,那麼枚舉所有的頂級窗口及其所有子窗口,以找到鼠標指針下的最上面的窗口。

+0

我仍然不確定OP想要哪一個,但是沒有必要刪除你的。 – chris

+0

不幸的是,當鼠標不在我的應用程序窗口範圍內時,這不起作用。 –

+1

@ user1600356看看更新 – Serge