Как определить, указывает ли мышь на максимизировать кнопку окна под курсором - PullRequest
0 голосов
/ 02 февраля 2012

Как определить, указывает ли мышь (навести курсор на) кнопку максимизации окна, даже если это окно не из моего приложения. Есть ли для этого API?

1 Ответ

5 голосов
/ 02 февраля 2012

Вы можете отправить WM_NCHITTEST в это окно. Возвращаемое значение будет соответствовать типу объекта по запрошенным координатам.

Примерно так:

bool IsMouseOverMaxBtn(HWND hWnd)
{
    POINT pt;
    VERIFY(GetCursorPos(&pt)); // get mouse position

    int retVal = SendMessage(hWnd, WM_NCHITTEST, 0, MAKELONG(pt.x, pt.y));

    return HTMAXBUTTON == retVal;
}

Edit:

Вы можете отправить это сообщение в любое окно (не обязательно принадлежащее вашей теме / процессу). Поскольку указатели не задействованы (например, строковые указатели) - проблем нет.

Однако следует помнить, что отправка (а не публикация) сообщения в окне, принадлежащем другому потоку, является довольно сложной операцией, во время которой ваш поток приостанавливается. Может даже случиться ситуация, когда ваш поток зависает, потому что поток приложения, обслуживающего это окно, зависает.

Вы можете использовать SendMessageTimeout, чтобы гарантировать, что ваша нить не зависнет.

...