API SetCursor

Iniciado por DarkMatrix, 21 Diciembre 2010, 08:09 AM

0 Miembros y 2 Visitantes están viendo este tema.

DarkMatrix

Buenas, tengo un pequeño problema con una aplicacion que no me carga un cursor, debido a esto me vi obligado a usar varias APIs para cargar el cursor. En si la aplicacion si cargo el cursor correctamente pero solo hasta que se mueve el mouse luego de eso regresa al anterior :S.

La idea es cargar el cursor en la aplicacion y cuando esta cierre que el cursor quede como estaba.

Aca les dejo el code que encontre pero es el que cambia al mover el cursor:

Código (vb) [Seleccionar]


    Private Declare Function LoadCursorFromFile Lib "user32.dll" Alias "LoadCursorFromFileA" (ByVal lpFileName As String) As Long
    Private Declare Function SetCursor Lib "user32.dll" (ByVal hCursor As Long) As Long

    ' Display the application starting (arrow and hourglass) Windows
    ' cursor for three seconds. The cursor resource is loaded from Windows. Then
    ' restore the old cursor (whatever it happens to be).

    Dim hcursor    As Long ' receives handle to application starting cursor
    Dim holdcursor As Long ' receives handle to previously used cursor
    Dim retval     As Long ' throw-away return value

    hcursor = LoadCursor(0, IDC_APPSTARTING) ' load Windows's application starting cursor
    holdcursor = SetCursor(hcursor) ' set it to the new cursor

    Sleep 3000 ' wait for 3 seconds

    retval = SetCursor(holdcursor) ' set it to the previous cursor



NOTA: Intente cambiando el cursor actual con SetSystemCursor pero no creo que eso sea buena idea ya que despues hay que restaurar el cursor de forma manual :S.

Todo aquello que no se puede hacer, es lo que no intentamos hacer.
Projecto Ani-Dimension Digital Duel Masters (Juego de cartas masivo multijugador online hecho en Visual Basic 6.0)

Desing by DarkMatrix

raul338

No uses Sleep, usa doevents, BlackZeroX tiene una funcion que te puede ayudar

DarkMatrix

Si lo intente con DoEvents pero inmediatamente despues de cambiar el cursor vuelve al anterior :S

Todo aquello que no se puede hacer, es lo que no intentamos hacer.
Projecto Ani-Dimension Digital Duel Masters (Juego de cartas masivo multijugador online hecho en Visual Basic 6.0)

Desing by DarkMatrix

79137913

HOLA!!!

Intentaste no usar el cursor, usa un shape o form o picturebox o lo que sea que persiga al mouse, entonces tenes un mouse "visible".

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

raul338

Cita de: DarkMatrix en 21 Diciembre 2010, 18:04 PM
Si lo intente con DoEvents pero inmediatamente despues de cambiar el cursor vuelve al anterior :S

Esporque tenes que hacer doevents mediante 3 segundos, con algun bucle o algo :P

Karcrack

Cita de: raul338 en 21 Diciembre 2010, 18:24 PM
Esporque tenes que hacer doevents mediante 3 segundos, con algun bucle o algo :P
:¬¬ Entonces porque no usar Sleep() :huh:

Aun asi, la cosa seria como esto:
Sub Wait(lMs as long)
dim lTimer as long
lTimer = Timer()
do
DoEvents
loop while (Timer() - lTimer < lMs)
end sub

raul338

Karcrack, porque el sleep congela todo :xD

DarkMatrix

Creo que no me entendieron mucho de que se trata :S, bueno aqui subi un projecto de ejemplo: http://www.megaupload.com/?d=T0HXO5OF

Ok el codigo es este:

Código (vb) [Seleccionar]

Option Explicit

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function LoadCursorFromFile Lib "user32.dll" Alias "LoadCursorFromFileA" (ByVal lpFileName As String) As Long
Private Declare Function SetCursor Lib "user32.dll" (ByVal hCursor As Long) As Long

Private Sub Form_Load()

    Dim hCursor    As Long
    Dim holdcursor As Long
    Dim retval     As Long

    hCursor = LoadCursorFromFile(App.Path & "\AB1.cur")

    If hCursor = 0 Then End

    holdcursor = SetCursor(hCursor)
   
    Sleep 3000 ' Mientras la aplicacion se encuentra pausada el cursor se mantiene
   
    retval = SetCursor(holdcursor) ' si se anula esta linea para no restaurar el cursor anterior, igual vuelve a como estaba antes :S.

End Sub



Lo que quiero lograr es que el cursor se mantenga hasta finalizar la aplicacion o llamar a la funcion para restaurarlo. Alguna idea del porque el cursor vuelve a como estaba?

Todo aquello que no se puede hacer, es lo que no intentamos hacer.
Projecto Ani-Dimension Digital Duel Masters (Juego de cartas masivo multijugador online hecho en Visual Basic 6.0)

Desing by DarkMatrix

raul338

Código (vb) [Seleccionar]

Option Explicit

Private Declare Function SetCursor Lib "user32.dll" (ByVal hcursor As Long) As Long
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Const IDC_APPSTARTING As Long = 32650
Private Const IDC_ARROW As Long = 32512&
Private Declare Function LoadCursor Lib "user32.dll" Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As Any) As Long
Dim normal As Long, wait As Long

Private Sub Form_Load()
    wait = LoadCursor(0&, IDC_APPSTARTING)
    normal = LoadCursor(0&, IDC_ARROW)
    Esperar 3000
    Call SetCursor(normal) ' set it to the previous cursor
End Sub

Public Sub Esperar(Miliseconds As Long)
    Dim retraso As Long
    'GetTickCount devuelve un valor inicial, y se lo sumamos al de retraso
    retraso = Miliseconds + GetTickCount
    While retraso >= GetTickCount
        DoEvents
        Call SetCursor(wait)
    Wend
End Sub


El problema fue que apenas se ponia el cursor, se cambiaba el cursor a otro segun el evento de una ventana  :P por eso en ese bucle, forzamos a mostrar nuestro cursor :P

Psyke1

¿Lo que buscas no es esto? :huh:

Código (vb) [Seleccionar]
Option Explicit

Private Declare Function LoadCursorFromFile Lib "user32.dll" Alias "LoadCursorFromFileA" (ByVal lpFileName As String) As Long
Private Declare Function SetCursor Lib "user32.dll" (ByVal hCursor As Long) As Long

Private hOldCursor              As Long
Private bStop                   As Boolean

Private Sub Form_Load()
Dim hCursor                     As Long

   hCursor = LoadCursorFromFile("c:\bullseye.cur")

   If hCursor = 0 Then End
   
   Me.Show: DoEvents
   
   Do While bStop = False
       hOldCursor = SetCursor(hCursor)
       DoEvents
   Loop
End Sub

Private Sub Form_Unload(Cancel As Integer)
   bStop = True
   Call SetCursor(hOldCursor)
End Sub


DoEvents! :P