Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Вид (стиль) курсора мышки


Автор: kma 16.3.2006, 12:00
Подскажите, каким образом в С++ можно получить (перехватить) стиль курсора мышки при движении мыши в Internet Explorer. Т.е. стоит задача определить когда форма курсора принимает вид "пальца"

smile Желательно smile

Автор: Romikgy 16.3.2006, 12:03
Следи за мышью и бери GetCursor
как увидишь что он палец , значит то что те нужно

Автор: kma 16.3.2006, 12:17
Цитата(Romikgy @ 16.3.2006, 12:03)
Следи за мышью и бери GetCursor
как увидишь что он палец , значит то что те нужно

Это таки да, но как из него стиль выдернуть?

Автор: Romikgy 16.3.2006, 14:55
Цитата(kma @ 16.3.2006, 11:17 Найти цитируемый пост)
GetCursor

он те и вернет

Автор: kma 16.3.2006, 15:53
Где можно посмотреть эти стили, функция это возвращает в 16 значении

Автор: Romikgy 16.3.2006, 16:35
Эта ф-ция возвращает HCURSOR, это хендл курсора,
а смотреть можно в МСДН
если набрать LoadCursor
то в хелпе (МСДН) будет так
Код

IDC_APPSTARTING    Standard arrow and small hourglass
IDC_ARROW    Standard arrow
IDC_CROSS    Crosshair
IDC_IBEAM    Text I-beam
IDC_ICON    Windows NT only: Empty icon
IDC_NO    Slashed circle
IDC_SIZE    Windows NT only: Four-pointed arrow
IDC_SIZEALL    Same as IDC_SIZE
IDC_SIZENESW    Double-pointed arrow pointing northeast and southwest
IDC_SIZENS    Double-pointed arrow pointing north and south
IDC_SIZENWSE    Double-pointed arrow pointing northwest and southeast
IDC_SIZEWE    Double-pointed arrow pointing west and east
IDC_UPARROW    Vertical arrow
IDC_WAIT    Hourglass

Автор: kma 16.3.2006, 16:59
Спосибо тебе smile

Автор: Romikgy 16.3.2006, 17:34
kma, а тебе пожалуйста smile

Автор: kma 16.3.2006, 17:55
Появилась проблема, написал
Код

if(GetCursor()==IDC_HAND)

Компилятор выдает ошибку: error C2065: 'IDC_HAND' : undeclared identifier
Подскажи пожалуйста что нужно сделать, файл “ #pragma comment(lib, "user32")” подключил

Автор: Romikgy 16.3.2006, 18:04
#include <windows.h>
or
#include <winuser.h>

Автор: kma 16.3.2006, 18:14
Все равно ругается smile

Автор: Romikgy 16.3.2006, 18:19
Код в студию

Автор: kma 16.3.2006, 18:32
Код

#include "stdafx.h"
#include "Max_Test.h"
#include "Max_TestDlg.h"
#include <windows.h>
#include <winuser.h>
#pragma comment(lib, "user32")
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#pragma comment(lib, "user32")


// CMax_TestApp

BEGIN_MESSAGE_MAP(CMax_TestApp, CWinApp)
    ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()


// CMax_TestApp construction

CMax_TestApp::CMax_TestApp()
{
    // TODO: add construction code here,
    // Place all significant initialization in InitInstance
}


// The one and only CMax_TestApp object

CMax_TestApp theApp;


// CMax_TestApp initialization

BOOL CMax_TestApp::InitInstance()
{
    InitCommonControls();
    CWinApp::InitInstance();
    AfxEnableControlContainer();
    SetRegistryKey(_T("Local AppWizard-Generated Applications"));
    for(;;)
    {
        if(GetCursor()==IDC_HAND)    
        {
            mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); // нажали левую кнопку мыши
            mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); 
        }
        /*int i=rand();
        int j=rand();
        if(i<700&&j<700)
        {
            HCURSOR MyCurs=GetCursor();
            Sleep(100);
            SetCursorPos(i,j);
        }*/
    }
    return FALSE;
}


Автор: Romikgy 17.3.2006, 10:14

if(GetCursor()==(LPSTR)((DWORD)(32649))
попробуй такое условие ,
имхо код правильный

Автор: kma 17.3.2006, 10:38
Цитата(Romikgy @ 17.3.2006, 10:14)
if(GetCursor()==(LPSTR)((DWORD)(32649))   

GetCursor() Так эта функция возвращает “HCURSOR”

Автор: Romikgy 17.3.2006, 10:56
Код

#define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i))) 
#define MAKEINTRESOURCE MAKEINTRESOURCEA 
#define IDC_HAND MAKEINTRESOURCE(32649) 

Это из Winuser.h

Автор: kma 17.3.2006, 11:26
Ругается на не соответствие типов данных
error C2446: '==' : no conversion from 'LPSTR' to 'HCURSOR'

Автор: Romikgy 17.3.2006, 12:45
if(GetCursor()==(HCURSOR)(32649)
А так сделай

Автор: kma 17.3.2006, 14:16
Не работает

Автор: Romikgy 17.3.2006, 16:52
Ты хошь отлавливать курсор в своем приложении или везде?

Автор: kma 17.3.2006, 17:00
Я хочу отлавливать стиль курсора везде

Автор: Earnest 17.3.2006, 20:11
HCURSOR - это одно, а IDC_HAND или что там еще - абсолютно другое. Нельзя их сравнивать.
Ну сами посудите: IDC_HAND - это 2-байтовый ид-р, для удобства преобразованный к LPTSTR...
Кроме того, кто сказал, что используется cтандартный IDC_HAND (даже если он похож - никто не мешает сделать свой ресурс).
Нет такого понятия "стиль курсора".
Вряд ли вообще возможно - что ты хочешь...

Автор: Romikgy 17.3.2006, 23:56
Цитата(kma @ 16.3.2006, 17:32 Найти цитируемый пост)
if(GetCursor()==IDC_HAND)

надо так

Код

if(GetCursor()==LoadCursor(0,IDC_HAND))

но лучше лоадкурсор вынести из цикла

Автор: kma 20.3.2006, 10:19
Цитата(Romikgy @ 17.3.2006, 23:56)
Код

if(GetCursor()==LoadCursor(0,IDC_HAND))


Компилятор ругается на 'IDC_HAND' пишет 'IDC_HAND' : undeclared identifier
Подскажи, почему он его не видит

Автор: Romikgy 20.3.2006, 11:23
У тя в файле
Цитата(kma @ 16.3.2006, 17:32 Найти цитируемый пост)
#include <winuser.h>

такие строки есть?
Код

#define IDC_HAND MAKEINTRESOURCE(32649) 

Добавлено @ 11:23
Кстати мож добавить эту строку , у ся в проекте

Автор: kma 20.3.2006, 11:34
Пробовал и так
Код

if(GetCursor()==LoadCursor(MAKEINTRESOURCE(32649)))

Программа не срабатывает

Автор: Romikgy 20.3.2006, 11:50
Цитата(kma @ 17.3.2006, 16:00 Найти цитируемый пост)
Я хочу отлавливать стиль курсора везде

Это я проглядел, smile

Цитата(kma @ 20.3.2006, 10:34 Найти цитируемый пост)
if(GetCursor()==LoadCursor(MAKEINTRESOURCE(32649)))

Это работает только в твоем приложении,
для глобального можно попытатся перехватывать SetSystemCursor, и смотреть че он меняет, или SetCursor

Автор: kma 22.3.2006, 11:22
Я написал
Код

SetCursor(LoadCursor(IDC_HAND));
SetSystemCursor(LoadCursor(IDC_HAND),NULL);

Ни чего не изменилось

Автор: Romikgy 22.3.2006, 14:33
Код

SetCursor(LoadCursor(0,IDC_HAND));
SetSystemCursor(LoadCursor(0,IDC_HAND),NULL);



Имхо так нужно

Автор: kma 23.3.2006, 10:31
Написал
Код

SetSystemCursor(LoadCursor(0,IDC_HAND),NULL);

Компилятор ругается
error C2661: 'CWinApp::LoadCursorA' : no overloaded function takes 2 arguments

Попробовал написать
Код

SetSystemCursor(::LoadCursor(0,IDC_HAND),NULL);

Ни чего не меняет

Автор: Romikgy 23.3.2006, 11:01
Цитата(kma @ 23.3.2006, 09:31 Найти цитируемый пост)
'CWinApp::LoadCursorA'

у тя компилятор понимает что LoadCursor это метод CWinApp, а эта функция виндов!!! Как ей сказать об этом.... не силен может так System::LoadCursor или так Window(s)::LoadCursor, я не в курсе smile

Автор: kma 23.3.2006, 11:31
я тоже не знаю может
Код

SetSystemCursor(::LoadCursor(0,IDC_HAND),NULL);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)