Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Lekim

#131
Hola

Si cada Item del ListBox contiene algo como esto "04 08 09", se tratan de cadenas STRING y NO lo puedes meter en una variable Integer. Ya que una variable integer solo acepta números  de -2.147.483.648 a 2.147.483.647.

Y esto:

item 0 = "01 02 03"
item 1 = "02 05 08"
item 2 = "04 08 09"

no son números son cadenas String o de texto. Evidentemente el 1 es un número el 3 también, pero si lo pones "01 03" no es número. En cambio "0103" sí es un número, pero entonces "01" pierde su individualidad como número, ya que se trata del 103.




#132
Cita de: HdM en  6 Abril 2016, 16:04 PM
¿Qué windows tienes?

Según versión, desde las propiedades de la unidad o bien desde el panel de control, puedas cambiar el comportamiento de la reproducción automática en caso de estar activada. Ese pendrive ¿alguna vez ha almacenado contenido multimedia? ¿Has mirado en la cfg. del wmplayer si hay alguna opción relacionada con ese comportamiento?

Enhorabuena!!! Parece que por ahí va la cosa. En panel de control hay icono con nombre "Reproducción automática" y es posible establecer el comportamiento a "No realizar ninguna acción". Sin embargo no hay ninguna referencia a dispositivo USB solo a CD y DVD y al comportamiento con dispositivos que contengan archivos multimedia.

#133
Cita de: Orubatosu en  6 Abril 2016, 14:45 PM
Menú Inicio > Ejecutar

Escribir: gpedit.msc y pulsar "intro"

En el árbol de la izquierda, seguir esta ruta:
Directiva de equipo local > Configuración del equipo > Plantillas administrativas > Sistema
Y en la ventana de la derecha, bajar hasta "Desactivar reproducción automática"

Pinchar en "Habilitar", y elegir la opción:

Desactivar reproducción automática en: Todas las unidades.



Gracias Orubatosu por la respuesta. Aunque soluciona el problema permíteme un 'pero'

Gpedit.msc no está disponible en todos los sistemas, creo que solo en las versiones Professional. En los Home no está disponible. Así que si alguien tiene un SO versión Home y tiene el mismo problema va a intentar ejecutar gpedit.msc y se va a llevar un chasco. Esto lo comento porque es muy común encontrar que mucha gente ofrece la solución del gpedit sin tener en cuenta o saber que no todo el mundo dispone de él.

Así que yo propongo la solución alternativa que es hacer manualmente lo mismo que hace gpedit.msc que es crear estas claves y valores en el registro de windows.

Deshabilitar Reproducción automática
CDROM

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoDriveTypeAutoRun"=dword:000000b5


TODAS LAS UNIDADES

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoDriveTypeAutoRun"=dword:000000ff



Para volver a habilitar, se borra NoDriveTypeAutoRun y listo.

(es necesario reiniciar explorer.exe, cerrar sesión, o reiniciar el sistema)

Sin embargo el otro pero es que si te duele la mano, no te cortas el brazo. Pues esto igual. Lo que yo busco es deshabilitar justamente esta acción de wmplayer.exe. Que no se si será algún servicio o habrá alguna clave del registro que se pueda crear o modificar para que no se enchegue.

s2s





#134
Hola

He notado que al introducir el USB se autoejecuta wmplayer.exe debido a que el puntero del ratón cambiaba de forma intermitente del puntero normal al de espera, lo cual resulta muy molesto. No solo por el puntero, si no porque me molesta a la hora de realizar tareas. Además wmplayer.exe se ejecuta de forma oculta, sin ventana.

Entonces tengo que ejecutar el Task Manager (taskmgr.exe) para visualizar los procesos y cerrar wmplayer.exe.

No se por qué se ejecuta, ni qué es lo que hace wmplayer.exe. Yo supongo que busca archivos de vídeo o música.

He probado buscar algo que haga referencia a esto pero no he encontrado nada.

¿Alguna idea al respecto?

Gracias

#135
Cita de: fary en  6 Abril 2016, 09:46 AM
Por supuesto que te ilustro  >:D

Aquí tienes mi código en ASM de una verdadera Shell Remota que usa pipes de manera eficiente.

...

¿Y en VB?, porque te recuerdo que esto es el foro para Visual Basic y aquí el amigo programa en VB. XD
#136
Suponiendo que el combo esté en la Fila/Row  0...

Código (vbnet) [Seleccionar]
DataGridView_signos.Item("nombre", 0).Value = "No"

Por cierto, eso es NET y este foro es par VB (a secas), no para Visual Studio .NET.

S2s




Código (vbnet) [Seleccionar]
 
        Dim DataGridView_signos As New DataGridView
       Dim columna_combobox As New DataGridViewComboBoxColumn

       columna_combobox.Name = "nombre"
       columna_combobox.Items.Add("No")
       columna_combobox.Items.Add("Si")
       DataGridView_signos.Columns.Add(columna_combobox) ' Añado la columna combobox al datagrid

       DataGridView_signos.Item("nombre", 0).Value = "No"
       Me.Controls.Add(DataGridView_signos)

#137
Cita de: fary en  5 Abril 2016, 10:37 AM
En realidad es una forma un poco chapucera de usar pipes  >:D

¿Tu programa sería capaz de ejecutar la instrucción "CD.." y mantenerse en esa ruta en ejecutar la siguiente instrucción?

Usa los pipes de manera eficiente amigo :)

un saludo.

¿Por qué no nos ilustras un poco con tu sabiduría? En lugar de criticar  :¬¬
#138
Al parecer tienes más de un controlador.

Como no tengo más dispositivos no puedo probar lo que te voy a proponer así que ya me contarás.

Este código obtiene una descripción de las versiones de controladores de captura:

Código (vb) [Seleccionar]
Private Declare Function capGetDriverDescriptionA Lib "avicap32.dll" (ByVal wDriver As Long, _
ByVal lpszName As String, ByVal cbName As Long, ByVal lpszVer As String, _
ByVal cbVer As Long) As Boolean

Private Sub Form_Load()
Dim strName As String
Dim strVer As String
Dim iReturn As Boolean
Dim X As Long

X = 0
strName = Space(100)
strVer = Space(100)

Do
iReturn = capGetDriverDescriptionA(X, strName, 100, strVer, 100)
If iReturn Then List1.AddItem Trim$(strName)
X = X + 1
Loop Until iReturn = False
End Sub


Obtiene un lista de controladores.

El NOMBRE de la lista del controlador que quieres utilizar es el que se debe establecer en

capCreateCaptureWindowA
:

capCreateCaptureWindowA(NOMBRE ,dwStyle, X, Y, nWidth, hWnd nID                 )

En dwStyle puedes establecer las constantes :
Código (vb) [Seleccionar]
Const WS_CHILD As Long = &H40000000
Const WS_VISIBLE As Long = &H10000000


Si pones List1.List(0), utilizará el primero de la lista.

Tú has puesto "WebcamCapture", quizás este sea el problema.

He realizado este código a partir del que encontré aquí:

Manejo de cámara

Está muy bien porque no necesitas el Timer y la transición entre imágenes es muy suave. La diferencia con el de la página es que uso el nombre del controlador en lugar de iDevice que es un número, y capCreateCaptureWindowA demanda String y reservo el índice en IndexDevice  para el SendMessage. Además puedes guardar imagen de un frame en un instante determinado sin que la captura que se muestra en el Picture se congele.

Necesitas tres botones, un listbox y un Picture, con los nombres:
cmdConectar
cmdDesconectar
cmdGuardar
List1
Picture1

Código (vb) [Seleccionar]


Const WM_CAP As Integer = &H400

Const WM_CAP_DRIVER_CONNECT As Long = 1034
Const WM_CAP_DRIVER_DISCONNECT As Long = 1035
Const WM_CAP_DRIVER_GET_FRAME As Long = 1084
Const WM_CAP_EDIT_COPY As Long = WM_CAP + 30

Const WM_CAP_SET_PREVIEW As Long = WM_CAP + 50
Const WM_CAP_SET_PREVIEWRATE As Long = WM_CAP + 52
Const WM_CAP_SET_SCALE As Long = WM_CAP + 53
Const WS_CHILD As Long = &H40000000
Const WS_VISIBLE As Long = &H10000000
Const SWP_NOMOVE As Long = &H2
Const SWP_NOSIZE As Integer = 1
Const SWP_NOZORDER As Integer = &H4
Const HWND_BOTTOM As Integer = 1


Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long

Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, _
ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Private Declare Function DestroyWindow Lib "user32" (ByVal hndw As Long) As Boolean

Private Declare Function capCreateCaptureWindowA Lib "avicap32.dll" _
(ByVal lpszWindowName As String, ByVal dwStyle As Long, _
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _
ByVal nHeight As Integer, ByVal hWndParent As Long, _
ByVal nID As Long) As Long

Private Declare Function capGetDriverDescriptionA Lib "avicap32.dll" (ByVal wDriver As Long, _
ByVal lpszName As String, ByVal cbName As Long, ByVal lpszVer As String, _
ByVal cbVer As Long) As Boolean


Dim strDevice As String
Dim IndexDevice As Integer
Dim hHwnd As Long

Private Sub cmdDesconectar_Click()
cmdConectar.Enabled = True
cmdGuardar.Enabled = False
cmdDesconectar.Enabled = False
Desconectar
End Sub

Private Sub cmdGuardar_Click()
On Error GoTo EvitarError:
Dim objPic As IPictureDisp

'//Guarda una imagen de un frame
SendMessage hHwnd, WM_CAP_EDIT_COPY, 0, 0
If Clipboard.GetFormat(vbCFBitmap) Then
Set objPic = Clipboard.GetData(vbCFBitmap)
SavePicture objPic, App.Path & "\ImagenWebCam1.bmp"

End If
EvitarError:
If Err.Number <> 0 Then
MsgBox (Err.Description)
End If
End Sub

Private Sub cmdConectar_Click()

strDevice = List1.List(List1.ListIndex)
IndexDevice = List1.ListIndex
ConectarCamara
End Sub
'//Conecta la cámara
Private Sub ConectarCamara()

'//Activa la webcam
hHwnd = capCreateCaptureWindowA(strDevice, WS_VISIBLE Or WS_CHILD, 0, 0, 640, 480, Picture1.hwnd, 0)
If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, IndexDevice, 0) Then
SendMessage hHwnd, WM_CAP_SET_SCALE, False, 0
SendMessage hHwnd, WM_CAP_SET_PREVIEWRATE, 66, 0
SendMessage hHwnd, WM_CAP_SET_PREVIEW, True, 0


SetWindowPos hHwnd, HWND_BOTTOM, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, _
SWP_NOMOVE Or SWP_NOZORDER

cmdGuardar.Enabled = True
cmdDesconectar.Enabled = True
cmdConectar.Enabled = False

Else
DestroyWindow hHwnd
cmdGuardar.Enabled = False
End If

End Sub

'//Muestra una lista de controladores
Private Sub CargarListaControladores()
Dim strName As String
Dim strVer As String
Dim iReturn As Boolean
Dim x As Long

x = 0
strName = Space(100)
strVer = Space(100)
Do
iReturn = capGetDriverDescriptionA(x, strName, 100, strVer, 100)
If iReturn Then List1.AddItem Trim$(strName)
x = x + 1
Loop Until iReturn = False
End Sub
'//Descanecta la camara
Sub Desconectar()
Dim x As Long
   DoEvents
   x = SendMessage(hHwnd, WM_CAP_DRIVER_DISCONNECT, 0, 0)
   x = DestroyWindow(hHwnd)
End Sub



Private Sub Form_Load()
cmdConectar.Caption = "Conectar"
cmdDesconectar.Caption = "Desconectar"
cmdGuardar.Caption = "Guardar frame"
cmdGuardar.Enabled = False
cmdDesconectar.Enabled = False

CargarListaControladores
'Seleciona el primer controlador de la lista
If List1.ListCount > 0 Then
List1.Selected(0) = True
cmdConectar.Enabled = True
Else
cmdConectar.Enabled = False
MsgBox ("No Device Available")
End If


End Sub




El índice del controlador queda guardado en IndexDevice cuando se selecciona en el ListBox. Se envía un mensaje con este índice y si dicho índice no está en la lista no se activa.

SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, IndexDevice, 0)

Prueba a ir cambiando el controlador de la lista a ver si no te aparece el diálogo.

Una vez me apareció cuando conecté y desconecté rápidamente pero, por mucho que lo he vuelto a hacer no me vuelve a salir. No tengo ni idea de porqué. Si el controlador está siendo usado por otra apliación, el picture aparece de color verde.




s2s
#139
Hola

He probado tu código y a mi no me aparece ningún diálogo.



Código (vb) [Seleccionar]


Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" _
    Alias "capCreateCaptureWindowA" ( _
    ByVal lpszWindowName As String, _
    ByVal dwStyle As Long, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal nWidth As Long, _
    ByVal nHeight As Long, _
    ByVal hwndParent As Long, _
    ByVal nID As Long) As Long
 
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
    ByVal hwnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    lParam As Any) As Long
 
Private Declare Function DestroyWindow Lib "user32" (ByVal hndw As Long) As Boolean

Private Const CONNECT As Long = 1034
Private Const DISCONNECT As Long = 1035
Private Const GET_FRAME As Long = 1084
Private Const COPY As Long = 1054
Private hWndCap As Long
'//Activar Cámara web
Private Sub Command1_Click()
Conectar
Timer1.Enabled = True
End Sub
'//Desconecta la cámara web
Private Sub Command2_Click()
Dim ClearImage As IPictureDisp
Desconectar
Timer1.Enabled = False
Picture1.Refresh
Picture1.Picture = ClearImage
End Sub

Public Sub CapturarCamara()
Dim x As Long
Picture1.Refresh
x = SendMessage(hWndCap, GET_FRAME, 0, 0)
x = SendMessage(hWndCap, COPY, 0, 0)
Picture1.Picture = Clipboard.GetData
End Sub
Sub Conectar()
   Dim x As Long
    hWndCap = capCreateCaptureWindow("WebcamCapture", 0, 0, 0, 640, 480, Me.hwnd, 0)
    DoEvents
    x = SendMessage(hWndCap, CONNECT, 0, 0)

End Sub
Sub Desconectar()
Dim x As Long
    DoEvents
    x = SendMessage(hWndCap, DISCONNECT, 0, 0)
    x = DestroyWindow(hWndCap)
End Sub

Private Sub Form_Load()
Timer1.Interval = 1
Timer1.Enabled = False
End Sub

Private Sub Form_Unload(Cancel As Integer)
   Dim x As Long
   Desconectar
    x = DestroyWindow(hWndCap)
End Sub

Private Sub Timer1_Timer()
CapturarCamara
End Sub


#140
Cita de: Eleкtro en 30 Marzo 2016, 19:35 PM
Sí, con el código que te mostré ocurre lo mismo, lo que te dije es que despues de mostrar el msgbox (unos ms despues), la barra se completará, por que le estás dejando tiempo suficiente para que se redibuje el control.

Lo intentaré explicar de una forma más simple para que se entienda mejor:
Cuando le asignas un valor del 0 al 100 a la barra de progreso, de una forma rápida como en tu código, y ves que no se completa la barra al mismo tiempo, es sencillamente por que le estás enviando actualizaciones de valor más rápido del tiempo necesario que el control o ventana necesita para procesar ese mensaje y actualizar la animación entre cada valor.


Con cualquier código el, mio o el tuyo, yo si veo que acaba la barra, pero el mensaje se muestra antes que acabe. Ya supongo que el proceso matemático por así decirlo va más rápido que el gráfico. El problema está cuando se trata de dar a la oportunidad al usuario de cancelar un cierre de sesión o de windows y gráficamente parece que aún da tiempo pero en realidad no es así, además que parece que se cierra antes de tiempo.

Y gracias por el snippet.

s2s




He probado el Snippet. Va bien, pero vamos que pasa lo mismo.

Este cierra la aplicación tras 5 segundos. Pero claro, visualmente parece que lo haga antes.

Código (vbnet) [Seleccionar]
Public Class Form1

    Private Sub UpdateProgress(ByVal value As Integer)
        Me.ProgressBar1.PerformStep()
        My.Application.DoEvents()
    End Sub

    Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
        Me.ProgressBar1.Minimum = 0
        Me.ProgressBar1.Maximum = 100
        Me.ProgressBar1.Step = 1
        Dim Segundos As Integer = 5

        For x As Integer = 0 To 100
            Threading.Thread.Sleep(Segundos * 10)
            UpdateProgress(x)
        Next
        If ProgressBar1.Value = ProgressBar1.Maximum Then
            Close()
        End If
    End Sub
End Class