1

選択したピクセルの色を印刷する非常に単純なプログラムを書いています。これが私のコードです:

#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 プログラミングの経験が少しあります。間違いを指摘していただけますか?

前もって感謝します。

4

1 に答える 1

1

まず、WindowFromPointを試してください。ウィンドウが見つからない場合、つまりそれがプロセス ウィンドウでない場合は、すべてのトップレベル ウィンドウとそのすべての子ウィンドウを列挙して、マウス ポインターの下にある最上位のウィンドウを見つけます。

于 2012-09-29T16:53:01.093 に答える