Конференция "KOL" » Как изменить системный курсор? [Delphi, Windows]
 
  • Grademax (14.07.11 13:25) [0]
    Стоит задача поменять системный курсор (на свой) не только в пределах своей формы, но и над рабочим столом.

    Для Delphi VCL нашел вот такой код:


    const crMyCursor = 5;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     Screen.Cursors[crMyCursor] := LoadCursor(HInstance, 'NewCursor');
     Cursor := crMyCursor;
    end;



    Вопрос в том, как адаптировать это для KOL.
  • Омлет © (14.07.11 13:38) [1]
    > Cursor := crMyCursor;

    Это не изменит курсора вне формы.
  • Jon © (14.07.11 15:14) [2]

     SetSystemCursor(LoadCursor(HInstance, 'NewCursor'), OCR_NORMAL);

  • ~AQUARIUS~ (14.07.11 15:26) [3]
    Jon
    1) The system destroys hcur by calling the DestroyCursor function. Therefore, hcur cannot be a cursor loaded using the LoadCursor function (из msdn)
    Другими словами, использовать LoadCursor для загруки курсора нельзя
    2) Вы что, собираетесь из приложения менять курсор гобально в системе? Без явного разрешения пользователя? ИМХО для такой программы место одно - корзина
  • GradeMax (14.07.11 17:32) [4]

    > Вы что, собираетесь из приложения менять курсор гобально
    > в системе? Без явного разрешения пользователя? ИМХО для
    > такой программы место одно - корзина


    Всё проще гораздо... Делаю программу, которая будет управлять "чужими" окнами. Например, пишите вы пояснительную записку ну скажем в Worde, в вашей записке много расчетов и считаете вы по ходу написания этой самой записки... и неплохо было бы, чтобы окно обычного калькулятора (речь о калькуляторе Microsoft) было поверх всех... (это так для примера, а  вариантов много вообще).

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

    В общем весь замес в этом... Можно сделать конечно проще, но хочется именно так (мы лёгких путей не ищем :)
  • Дмитрий К © (14.07.11 19:26) [5]
  • Grademax (15.07.11 10:00) [6]
    Всё... разобрался...
    Вот готовый вариант программы (если кому интересно :)

    uses windows, messages, KOL;
    var W:PControl;
    {----------------------------------------------------------------------------}
    // Эта функция возвратит Handle компонента, который находится под курсором мыши.
    Function GetWinHandle:HWND;
    var PT:TPoint; // Структура для хранения глобальных координат мышки
    begin
        GetCursorPos(PT);
        Result := WindowFromPoint(PT);
    end;
    {----------------------------------------------------------------------------}
    Procedure WMouseDown(Dummy:Pointer; Sender:PControl; var Mouse:TMouseEventData);
    begin
        W.Cursor:=LoadCursor(0, IDC_HAND);
        SetCapture(W.Handle); // Захватываем мышь (пока нажата кнопка на ней)
    end;
    {----------------------------------------------------------------------------}
    Procedure WMouseUp(Dummy:Pointer; Sender:PControl; var Mouse:TMouseEventData);
    var HW:THandle;
    begin
        ReleaseCapture; // Отменяем захват мыши
        W.Cursor:=LoadCursor(0, IDC_ARROW);
        HW := GetWinHandle;

        if Mouse.Button = mbLeft then
         begin
           if HW<>0 then begin
               ShowWindow(HW, sw_hide);
               ShowWindow(HW, SW_SHOW {SW_SHOWDEFAULT});
               SetWindowPos(HW, HWND_TOPMOST, 1, 1, 20, 20, SWP_NOMOVE + swp_nosize);
               end;
         end;
        // Если была нажата правая кнопка мыши, то включаем "Нормальный режим"
        if Mouse.Button = mbRight then
           SetWindowPos(HW, HWND_NOTOPMOST, 1, 1, 20, 20, SWP_NOMOVE + swp_nosize);
    end;
    {----------------------------------------------------------------------------}
    Procedure StartForm;
    begin
        W := NewForm( Applet, 'TopSet v1.0' ).SetClientSize( 100, 50 ).SetPosition(1,1);
        W.Margin := 0;
        W.ExStyle := WS_EX_TOOLWINDOW;
        W.StayOnTop:=True;
        W.CanResize := False;

        W.OnMouseDown:=TOnMouse(MakeMethod(nil, @WMouseDown));
        W.OnMouseUp:=TOnMouse(MakeMethod(nil, @WMouseUp));

        Run( W );
    end;
    {----------------------------------------------------------------------------}
    begin
        StartForm;
    end.



    Работать с ней так:
    Щелчек левой клавишей по окну "TopSet", далее (не отпуская левую клавишу) перемещаем мышь на заголовок окна (или на рамку окна) ну пусть того же Калькулятора и отпускаем левую клавишу... Окно калькулятора станет поверх всех.

    Те же манипулящии с првой клавишей мыши - вернут "чужому" приложению обычный режим (не поверх всех).
  • RusSun © (17.07.11 03:05) [7]
    Есть предложение, а можно делать несколько чужих окон поверх? Как бы объединяя их в группу например калькулятор и др приложение чтобы видеть что в расчётах и если не надо группу можно свернуть? ;)

    Как в скайпе сделаны "о'кошки" :) утренний позитив.
    (да не рассердится модератор на меня.)
 
Конференция "KOL" » Как изменить системный курсор? [Delphi, Windows]
Есть новые Нет новых   [120349   +19][b:0][p:0.002]