Как скрыть курсор руки от кнопок Java?

Я хочу скрыть курсор рука из настольного приложения Java с виртуальной клавиатурой, где, когда курсор мыши находится над каждым числом, курсор изменяется на стиль рука.

введите здесь описание изображения

Я попробовал следующий код, используя прозрачное изображение (файл .cur) в качестве ресурса, но не смог скрыть курсор hand.

Можно ли скрыть курсор рука от такого элемента?

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}
{$R 'mycursor.res'}

uses
  Windows,
  Messages,
  SysUtils;

procedure MyShowCursor(Show: Boolean);
const
  OCR_HELP = 32651;
var
  xCursor: HCURSOR;
begin
  if Show then
    SystemParametersInfo(SPI_SETCURSORS, 0, 0, WM_SETTINGCHANGE or SPIF_UPDATEINIFILE)
  else
  begin
    xCursor := LoadCursor(HInstance, 'XCURSOR');
    SetSystemCursor(xCursor, OCR_NORMAL);
    xCursor := LoadCursor(HInstance, 'XCURSOR');
    SetSystemCursor(xCursor, OCR_APPSTARTING);
    xCursor := LoadCursor(HInstance, 'XCURSOR');
    SetSystemCursor(xCursor, OCR_CROSS);
    xCursor := LoadCursor(HInstance, 'XCURSOR');
    SetSystemCursor(xCursor, OCR_HAND);
    xCursor := LoadCursor(HInstance, 'XCURSOR');
    SetSystemCursor(xCursor, OCR_HELP);
    xCursor := LoadCursor(HInstance, 'XCURSOR');
    SetSystemCursor(xCursor, OCR_IBEAM);
    xCursor := LoadCursor(HInstance, 'XCURSOR');
    SetSystemCursor(xCursor, OCR_NO);
    xCursor := LoadCursor(HInstance, 'XCURSOR');
    SetSystemCursor(xCursor, OCR_SIZEALL);
    xCursor := LoadCursor(HInstance, 'XCURSOR');
    SetSystemCursor(xCursor, OCR_SIZENESW);
    xCursor := LoadCursor(HInstance, 'XCURSOR');
    SetSystemCursor(xCursor, OCR_SIZENS);
    xCursor := LoadCursor(HInstance, 'XCURSOR');
    SetSystemCursor(xCursor, OCR_SIZENWSE);
    xCursor := LoadCursor(HInstance, 'XCURSOR');
    SetSystemCursor(xCursor, OCR_SIZEWE);
    xCursor := LoadCursor(HInstance, 'XCURSOR');
    SetSystemCursor(xCursor, OCR_UP);
    xCursor := LoadCursor(HInstance, 'XCURSOR');
    SetSystemCursor(xCursor, OCR_WAIT);
  end;
end;

begin
  try
    MyShowCursor(False);
    Sleep(15000);
    MyShowCursor(True);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

person Coringa    schedule 23.05.2021    source источник
comment
Я не понимаю связи между приложением Java и вашим кодом Delphi. Ни то, что вы действительно хотите сделать. Пожалуйста, объясни.   -  person fpiette    schedule 23.05.2021
comment
@fpiette. решено. Спасибо за внимание.   -  person Coringa    schedule 23.05.2021


Ответы (1)


Из это ссылка, я так понял:

код java имеет собственное управление некоторыми курсорами, и в этом случае курсор в виде руки отличается от системы и имеет особое поведение.


Издание:

Извлечено из ссылки для удобства:

Вот моя проблема: у меня есть рамка с кнопкой. На этой кнопке я делаю

bouton.setCursor(new Cursor(Cursor.HAND_CURSOR));

когда я запускаю свою программу, в кадре есть курсор по умолчанию (стрелка) и кнопка в руке. На этом кадре у меня есть вторая кнопка, на которой у меня есть слушатель. Когда я нажимаю эту кнопку, я вызываю библиотеку, которая изменяет курсоры Windows, вызывая метод:

BOOL WINAPI SetSystemCursor(
  _In_  HCURSOR hcur,
  _In_  DWORD id
);
 
//OCR_HAND = 32649
SetSystemCursor(chemin_de_mon_image, 32649);
 
//OCR_NORMAL = 32512 
SetSystemCursor(chemin_de_mon_image, 32512 );
 
...

Итак, после нажатия кнопки 2 у меня есть все курсоры в моей Windows, которые изменены на мое изображение, например, даже курсор в виде руки на ссылках Google. В моем Java-приложении меняются все курсоры, кроме руки. Кажется, что Java не использует собственный курсор Windows для руки, но почему? Если у кого-то есть решение этой проблемы, меня это интересует, или объяснение.


попробуйте поставить что-то кроме руки, чтобы увидеть, перерисовывается ли этот новый курсор с помощью вашего метода. Идея состоит в том, чтобы увидеть, имеет ли это рука особое поведение или курсор, используемый для бурона .....


Спасибо за ваш ludomacho ответ. Пробовал с другими курсорами (подожди, крестик,...) и у меня получается поменять курсор, только основной курсор не работает. Когда мы внимательно смотрим на главный курсор, кажется, что он отличается от основного курсора системы (без затенения), в то время как для других курсоров они такие же. Есть очень простой тест, чтобы выяснить это: просто создайте рамку с двумя кнопками. На первом делаем: button1.setCursor(новый Курсор(Cursor.WAIT_CURSOR)); На втором делаем: button2.setCursor(новый Курсор(Cursor.HAND_CURSOR)); Затем мы идем в настройки Windows и изменяем внешний вид курсора руки и ожидания. В приложении будет изменен только курсор ожидания.


Java-код имеет собственное управление основным курсором. Для отображения основного курсора системы (Windows Seven) необходимо модифицировать JRE и перекомпилировать ее.

person Coringa    schedule 23.05.2021