ListBox una pequeña ayuda

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
Avatar de Usuario
yasmany
Hacker del Foro
Mensajes: 249
Registrado: 06 Sep 2011, 21:30

ListBox una pequeña ayuda

Mensaje por yasmany »

Estoy en el desarrollo de un software denominado Avy Antivirus orientado a la detección de malware y ciertas malas acciones que realiza dentro de los PenDrivesn (solo para la raíz de estas unidades extraíbles).
Estoy pensando en agregar una opcion para excluir los archivos o carpetas a los cuales no les voy analizar de acuerdo a lo que especifique el usuario y los que yo los ubique por defecto en la lista de exclusiones.

A continuación el código solo es un ejemplo, el listado es solo un ejemplo de lista, lo que en si mi consulta es;
¿Como Puedo hacer para que cuando escriba en el Input con solo pulsar enter este se agregue al listado?
¿Como puedo hacer para que cuando se haya eliminado un item la selección oscura continúe en el listado?
¿Como se restringe para que no esté permitido el tecleo de estos caracteres \ / : * ? " < > | y salga un Tip de aviso?

Desde ya muy agradecido, saludos :smt024

EDITADO...

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiButton.au3>

Global $listado, $btnAgregar, $ingreso, $btnBuscar, $valorBusqueda

$guiExclusiones = GUICreate("Ejemplo de exclusiones", 420, 288, 360, 124)
$listado = GUICtrlCreateList("", 16, 103, 383, 136, -1, $LBS_EXTENDEDSEL)
$ingreso = GUICtrlCreateInput("", 16, 72, 297, 21)
GUICtrlSetState($ingreso, $GUI_FOCUS)
$btnAgregar = GUICtrlCreateButton("Agregar", 320, 72, 83, 25)
$titulo = GUICtrlCreateLabel("Exclusiones", 16, 32, 60, 17)
$texto1 = GUICtrlCreateLabel("Escriba el nombre de los archivos o carpetas que desea excluir en el analisis", 16, 48, 364, 17)
$btnSalir = GUICtrlCreateButton("Salir", 328, 248, 75, 25)
$btnElimniar = GUICtrlCreateButton("Eliminar", 250, 248, 75, 25)
$btnBuscar = GUICtrlCreateButton("Buscar", 173, 248, 75, 25)
listaDeRegistro()

GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $btnAgregar
			agregarRegistro()
		Case $btnElimniar
			eliminarRegistro()

		Case $btnBuscar
			buscarEnListado()
		Case $btnSalir
			Exit
		Case $listado
			GUICtrlSetState($btnElimniar, $GUI_FOCUS)
	EndSwitch
WEnd

Func agregarRegistro()
	If GUICtrlRead($ingreso) = "" Then
		GUICtrlSetState($ingreso, $GUI_FOCUS)
	ElseIf _GUICtrlListBox_FindString($listado, GUICtrlRead($ingreso), True) <> -1 Then
		MsgBox(64, "Mensaje", "Ya existe este nombre", -1, $guiExclusiones)
		GUICtrlSetState($ingreso, $GUI_FOCUS)
	Else
		GUICtrlSetData($listado, GUICtrlRead($ingreso))
		GUICtrlSetData($ingreso, "")
		GUICtrlSetState($ingreso, $GUI_FOCUS)
	EndIf
EndFunc   ;==>agregarRegistro

Func eliminarRegistro()
	Local $iIndex
	$iIndex = _GUICtrlListBox_FindString($listado, GUICtrlRead($listado), True)
	_GUICtrlListBox_DeleteString($listado, $iIndex)
	GUICtrlSetState($listado, $GUI_FOCUS)
EndFunc   ;==>eliminarRegistro

Func buscarEnListado()
	If GUICtrlRead($ingreso) = "" Then
		MsgBox(64, "Mensaje", "Escriba el texto que desea Encontrar", -1, $guiExclusiones)
		GUICtrlSetState($ingreso, $GUI_FOCUS)
	Else
		If _GUICtrlListBox_FindString($listado, GUICtrlRead($ingreso), True) <> -1 Then
			MsgBox(64, "Mensaje", "Encontrado", -1, $guiExclusiones)
		Else
			MsgBox(16, "Mensaje", "No Encontrado", -1, $guiExclusiones)
		EndIf
	EndIf
EndFunc   ;==>buscarEnListado

Func listaDeRegistro()
	GUICtrlSetData($listado, "abc")
	GUICtrlSetData($listado, "123")
	GUICtrlSetData($listado, "xyz")
	GUICtrlSetData($listado, "opq")
	GUICtrlSetData($listado, "lmn")
	GUICtrlSetData($listado, "aeiou")
	GUICtrlSetData($listado, "bbb")
	GUICtrlSetData($listado, "mlnpñgh")
	GUICtrlSetData($listado, "vbxcxd")
	GUICtrlSetData($listado, "qwqwses")
	GUICtrlSetData($listado, "ererrerer")
	GUICtrlSetData($listado, "tytyty")
EndFunc   ;==>listaDeRegistro
Obra de modo que merezcas a tu propio juicio y a juicio de los demás la eternidad, que te hagas insustituible que no merezcas morir.
https://www.facebook.com/yasmanycurimilma
Avatar de Usuario
yasmany
Hacker del Foro
Mensajes: 249
Registrado: 06 Sep 2011, 21:30

Re: ListBox una pequeña ayuda

Mensaje por yasmany »

Hace un dia soluciones unas dudas pero aun continuo con estas
¿Como puedo hacer para que cuando se haya eliminado un ítem la selección oscura continúe en el listado?
¿Como se restringe para que no esté permitido el tecleo de estos caracteres \ / : * ? " < > | y salga un Tip de aviso?
Espero vuestra ayuda.

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiButton.au3>
#include <String.au3>

Global $listadoExcl, $btnAgregarExcl, $ingresoExcl, $btnBuscarExcl, $valorBusquedaExcl, $opcionExcl, $memoriaExcl

$guiExclusiones = GUICreate("Ejemplo de exclusiones", 420, 288, 360, 124, -1, 0x00000018)

$listadoExcl = GUICtrlCreateList("", 16, 103, 383, 136, -1, $LBS_EXTENDEDSEL)
$ingresoExcl = GUICtrlCreateInput("", 16, 72, 297, 21)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)

$btnAgregarExcl = GUICtrlCreateButton("Agregar", 320, 72, 83, 21)
GUICtrlSetState($btnAgregarExcl, $GUI_DEFBUTTON)

$titulo = GUICtrlCreateLabel("Exclusiones", 16, 12, 60, 17)
$texto1 = GUICtrlCreateLabel("Escriba el nombre de los archivos o carpetas que desea excluir en el analisis", 16, 32, 364, 17)
$opcionExcl = GUICtrlCreateCheckbox("Agregar solo nombre del elemento (Aplicable para todas las unidades )", 16, 50, 380, 17)
$btnSalir = GUICtrlCreateButton("Salir", 328, 248, 75, 25)
$btnElimniarExcl = GUICtrlCreateButton("Eliminar", 250, 248, 75, 25)
$btnBuscarExcl = GUICtrlCreateButton("Buscar", 173, 248, 75, 25)
listaDeRegistro()
GUICtrlSetState($ingresoExcl, $GUI_FOCUS)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE, $btnSalir
			Exit
		Case $btnAgregarExcl
			agregarRegistroExclusion()
		Case $btnElimniarExcl
			eliminarRegistroExclusion()

		Case $btnBuscarExcl
			buscarEnListado()
		Case $opcionExcl
			If GUICtrlRead($opcionExcl) = $GUI_CHECKED Then
				$memoriaExcl = GUICtrlRead($ingresoExcl)
				$text = _StringReverse(GUICtrlRead($ingresoExcl))
				$arrayExcl = StringSplit($text, '\', 1)
				GUICtrlSetData($ingresoExcl, "")
				GUICtrlSetData($ingresoExcl, _StringReverse($arrayExcl[1]))
				GUICtrlSetState($ingresoExcl, $GUI_FOCUS)
			Else

				If $memoriaExcl <> 0 Or $memoriaExcl <> "" Then
					GUICtrlSetData($ingresoExcl, "")
					GUICtrlSetData($ingresoExcl, $memoriaExcl)
				EndIf
				GUICtrlSetState($ingresoExcl, $GUI_FOCUS)
			EndIf
		Case $GUI_EVENT_DROPPED
			$memoriaExcl = 0
			If GUICtrlRead($opcionExcl) = $GUI_CHECKED Then
				GUICtrlSetData($ingresoExcl, "")
				$text = _StringReverse(@GUI_DragFile)
				$arrayExcl = StringSplit($text, '\', 1)
				GUICtrlSetData($ingresoExcl, _StringReverse($arrayExcl[1]))
			Else
				GUICtrlSetData($ingresoExcl, "")
				GUICtrlSetData($ingresoExcl, @GUI_DragFile)
			EndIf

	EndSwitch
WEnd

Func agregarRegistroExclusion()
	$memoriaExcl = 0
	Local $text, $array
	If GUICtrlRead($ingresoExcl) = "" Then
		GUICtrlSetState($ingresoExcl, $GUI_FOCUS)
	ElseIf _GUICtrlListBox_FindString($listadoExcl, GUICtrlRead($ingresoExcl), True) <> -1 Then
		MsgBox(64, "Mensaje", "Ya existe este nombre", -1, $guiExclusiones)
		GUICtrlSetState($ingresoExcl, $GUI_FOCUS)
	Else
		GUICtrlSetData($listadoExcl, GUICtrlRead($ingresoExcl))
		GUICtrlSetData($ingresoExcl, "")
		GUICtrlSetState($ingresoExcl, $GUI_FOCUS)
	EndIf
EndFunc   ;==>agregarRegistroExclusion

Func eliminarRegistroExclusion()
	Local $iIndex
	$iIndex = _GUICtrlListBox_FindString($listadoExcl, GUICtrlRead($listadoExcl), True)
	_GUICtrlListBox_DeleteString($listadoExcl, $iIndex)
	GUICtrlSetState($listadoExcl, $GUI_FOCUS)
EndFunc   ;==>eliminarRegistroExclusion

Func buscarEnListado()
	If GUICtrlRead($ingresoExcl) = "" Then
		MsgBox(64, "Mensaje", "Escriba el texto que desea Encontrar", -1, $guiExclusiones)
		GUICtrlSetState($ingresoExcl, $GUI_FOCUS)
	Else
		If _GUICtrlListBox_FindString($listadoExcl, GUICtrlRead($ingresoExcl), True) <> -1 Then
			MsgBox(64, "Mensaje", "Encontrado", -1, $guiExclusiones)
		Else
			MsgBox(16, "Mensaje", "No Encontrado", -1, $guiExclusiones)
		EndIf
	EndIf
EndFunc   ;==>buscarEnListado

Func listaDeRegistro()
	GUICtrlSetData($listadoExcl, @HomeDrive&"\Archivos de programa")
	GUICtrlSetData($listadoExcl, "Documents and Settings")
	GUICtrlSetData($listadoExcl, "MicrosoftSecurity")
	GUICtrlSetData($listadoExcl, "MSOCache")
	GUICtrlSetData($listadoExcl, "PerfLogs")
	GUICtrlSetData($listadoExcl, @HomeDrive&"\ProgramFiles")
	GUICtrlSetData($listadoExcl, "Recovery")
	GUICtrlSetData($listadoExcl, "System Volume Information")
	GUICtrlSetData($listadoExcl, "temp")
	GUICtrlSetData($listadoExcl, "Usuarios")
	GUICtrlSetData($listadoExcl, "Windows")
	GUICtrlSetData($listadoExcl, @HomeDrive&"\autoexec.bat")
	GUICtrlSetData($listadoExcl, "config.sys")
	GUICtrlSetData($listadoExcl, "install.exe")
	GUICtrlSetData($listadoExcl, "IO.SYS")
	GUICtrlSetData($listadoExcl, "MSDOS.SYS")
	GUICtrlSetData($listadoExcl, "Intel")
	GUICtrlSetData($listadoExcl, @HomeDrive&"\$WINDOWS.~LS")
	GUICtrlSetData($listadoExcl, "$Recycle.Bin")
	GUICtrlSetData($listadoExcl, "Boot")
	GUICtrlSetData($listadoExcl, "bootmgr")
	GUICtrlSetData($listadoExcl, "BOOTNXT")
	GUICtrlSetData($listadoExcl, "BOOTSECT.BAK")
	GUICtrlSetData($listadoExcl, "Config.Msi")
	GUICtrlSetData($listadoExcl, "DFFileTrace.txt")
	GUICtrlSetData($listadoExcl, "hiberfil.sys")
	GUICtrlSetData($listadoExcl, "pagefile.sys")
	GUICtrlSetData($listadoExcl, "swapfile.sys")
	GUICtrlSetData($listadoExcl, "bootmgr.efi")
	GUICtrlSetData($listadoExcl, "EFI")
	GUICtrlSetData($listadoExcl, "FactoryUpdate")
	GUICtrlSetData($listadoExcl, "hp")
	GUICtrlSetData($listadoExcl, "preload")
	GUICtrlSetData($listadoExcl, "RM_Reserve")
	GUICtrlSetData($listadoExcl, "91a62999c1c2c69ef8d2")
	GUICtrlSetData($listadoExcl, "cw.exe")
	GUICtrlSetData($listadoExcl, @HomeDrive&"\ProgramData")
	GUICtrlSetData($listadoExcl, "dfinstall.log")
	GUICtrlSetData($listadoExcl, "KQBST")
	GUICtrlSetData($listadoExcl, "winx.ld")
	GUICtrlSetData($listadoExcl, "Windows Activation Technologies")
	GUICtrlSetData($listadoExcl, ".Trash-999")
	GUICtrlSetData($listadoExcl, "msdownld.tmp")
	GUICtrlSetData($listadoExcl, "boot.ini")
	GUICtrlSetData($listadoExcl, "Bootfont.bin")
	GUICtrlSetData($listadoExcl, "NTDETECT")
	GUICtrlSetData($listadoExcl, "ntldr")
	GUICtrlSetData($listadoExcl, @HomeDrive&"\Recycler")
EndFunc   ;==>listaDeRegistro
PD: En este caso el listado a excluir es real para el analisis del sw en creación.
:smt024
Obra de modo que merezcas a tu propio juicio y a juicio de los demás la eternidad, que te hagas insustituible que no merezcas morir.
https://www.facebook.com/yasmanycurimilma
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: ListBox una pequeña ayuda

Mensaje por Dany »

podrias haer algo masomenos asi para lo del inputbox

Código: Seleccionar todo

Func _WM_COMMAND($hWHnd, $iMsg, $wParam, $lParam)

    ; If it was an update message from our input
    If _WinAPI_HiWord($wParam) = $EN_CHANGE And _WinAPI_LoWord($wParam) = $hInput Then

        ; Read the text
        $sText = GUICtrlRead($hInput)
        ; If there are any banned characters
        If StringRegExp($sText, '&|||<|>|"') Then
            ; Remove them
            GuiCtrlSetData($hInput, StringRegExpReplace($sText, '&|||<|>|"', ""))
        EndIf

    EndIf

EndFunc   ;==>_WM_COMMAND

saludos
  • ............................................Imagen
    ......................................Imagen
Avatar de Usuario
yasmany
Hacker del Foro
Mensajes: 249
Registrado: 06 Sep 2011, 21:30

Re: ListBox una pequeña ayuda

Mensaje por yasmany »

Gracias Dany, lo que en si no quiero que me borre, mas bien que al teclear alguno de aquellos caracteres me salte un tip del input, informando que no está permitido aquello, gracias por la respuesta, sigo intentando :smt024
Obra de modo que merezcas a tu propio juicio y a juicio de los demás la eternidad, que te hagas insustituible que no merezcas morir.
https://www.facebook.com/yasmanycurimilma
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: ListBox una pequeña ayuda

Mensaje por Dany »

Es lo que digo es cuestion de modificar el codigo :P

Código: Seleccionar todo

#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 300, 309, 192, 124)
$Edit1 = GUICtrlCreateInput("", 0, 0, 300, 20)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd



Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
Local $hWndFrom, $iIDFrom, $iCode, $hWndEdit
If Not IsHWnd($edit1) Then $hWndEdit = GUICtrlGetHandle($edit1)
$hWndFrom = $ilParam
$iIDFrom = _WinAPI_LoWord ($iwParam)
$iCode = _WinAPI_HiWord ($iwParam)
Switch $hWndFrom
    Case $edit1, $hWndEdit
        Switch $iCode

            Case $EN_CHANGE
       ;Aqui verificas y muestras el toolTip



        EndSwitch


 EndSwitch


Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Saludos
  • ............................................Imagen
    ......................................Imagen
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: ListBox una pequeña ayuda

Mensaje por Chefito »

Buenas. No se si has sacado las dos dudas que te quedaban.
Para el tema de eliminación de teclas, te recomiendo que lo hagas con ganchos (hooks). Engancha los mensajes de las teclas pulsadas y haz lo que quieras con ellas. Es un tema no de principiantes, pero dedicándole tiempo, y con todo el material que hay en el foro, lo lograrás controlar y adaptar :smt003 . Busca en el foro que hace años se habló de eso. Yo personalmente tengo muchos códigos dedicados a estos temas (http://www.emesn.com/autoitforum/viewto ... ook#p10210). Aquí van algunas búsquedas:

http://www.emesn.com/autoitforum/viewto ... hook#p9385
http://www.emesn.com/autoitforum/viewto ... clas#p9406
http://www.emesn.com/autoitforum/viewto ... ate#p11514
http://www.emesn.com/autoitforum/viewto ... tate#p4784

Yo creo que con esto tendrás suficiente información :smt003 . Intedtar utilizar el buscador, que muchos temas están ya muy trillados.
Intenta realizar algún código, y si tienes alguna duda pregunta y te la intentaremos resolver. Prefiero que lo intentes tu primero que darte el código inmediatamente.

Aaaaahhhh, mira también el ejemplo de la función _WinAPI_SetWindowsHookEx que más tarde implementó autoit en la udf WinApi. Aunque los códigos que te he pasado anteriormente se basan es esa implementación.

Respecto a la pregunta de señalar un item después de eliminar uno, mira en la ayuda la función _GUICtrlListBox_SetCurSel. Introduce esta función después de eliminar el item de la lista y se te señalará. Eso sí, tienes que decirle cual señalar. Eso lo dejo a tu criterio :smt002 .

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: ListBox una pequeña ayuda

Mensaje por Dany »

@Chefito demasiado complicado con hook podiendolo hacer con $EN_CHANGE.


Saludos
  • ............................................Imagen
    ......................................Imagen
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: ListBox una pequeña ayuda

Mensaje por Chefito »

Hombre, la verdad es que si es más complicado, pero hay muchas explicaciones y mucho código al respecto :smt024 .

Y yo te pregunto, como haces que no salga la tecla escrita con el evento EN_CHANGE? Porque creo recordar que hace tiempo lo intenté y no hubo forma. En cambio con hooks sí. Recuerdo haber puesto un código para que cuando escribiese el caracter que no quería, lo borrase inmediatamente, pero veo más correcto pararlo y que ni si quiera se escriba milésimas de segundo :smt003 .

No se, si sabes alguna otra forma de parar la escritura de caracteres en un control con eventos, yo la desconozco :smt017 .

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Avatar de Usuario
yasmany
Hacker del Foro
Mensajes: 249
Registrado: 06 Sep 2011, 21:30

Re: ListBox una pequeña ayuda

Mensaje por yasmany »

Gracias por responder, me ha servido para instruirme, por el momento obvié esa opción, pero en próximos softwares trataré de implementar. :smt001
Obra de modo que merezcas a tu propio juicio y a juicio de los demás la eternidad, que te hagas insustituible que no merezcas morir.
https://www.facebook.com/yasmanycurimilma
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: ListBox una pequeña ayuda

Mensaje por Dany »

@chefito el dijo que no importaba si salia el caracter. no leí nada sobre evitar caracteres.

con hook tampoco es muy difícil.

Saludos
  • ............................................Imagen
    ......................................Imagen
Responder