Comunidad Game Maker

Ayuda => Desarrollo de Scripts => Mensaje iniciado por: Texic en Agosto 01, 2012, 11:54:35 PM

Título: Asociar Extensión
Publicado por: Texic en Agosto 01, 2012, 11:54:35 PM
Creador: Texic
Versión de Gm utilizada:  :GM8:
Descripción: Este script sirve para crear una asociación entre un tipo de archivo y un archivo ejecutable. Puede hacerlo de dos maneras, por medio de los scripts en gml (silencioso), y si no funciona (por ejemplo en windows 7 o similares) pasa al modo no silencioso, creando y ejecutando un archivo de registro .reg
Script:
//argument0: Extensión a asociar (string) Ej: ".svk"
//argument1: Ruta del archivo con que abrirlo (string) Ej: "C:\Mijuego\Juego.exe"
//argument2: Ruta del ícono asociado (string) Ej: "C:\Mijuego\Icono.ico" (Opcional)
//argument3: Tipo de archivo (string) Ej: "Archivo Guardado"
b=registry_set_root(2)
if registry_exists("\"+argument0) {exit}
b+=registry_write_string_ext("\"+argument0,"",string_copy(argument0,2,3)+"file")
b+=registry_write_string_ext('\'+string_copy(argument0,2,3)+"file","",argument3)
b+=registry_write_string_ext('\'+string_copy(argument0,2,3)+"file"+'\shell\open\command',"",argument1+' %1')
if variable_local_exists(argument2) {b+=registry_write_string_ext("\"+string_copy(argument0,2,3)+"\DefaultIcon","",argument2)}
if b=0{
argument1=string_replace_all(string_replace_all(argument1,"\","|"),"|","\\")
argument2=string_replace_all(string_replace_all(argument2,"\","|"),"|","\\")
str='Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\'+argument0+']
@="'+string_copy(argument0,2,3)+"file"+'"

[HKEY_CLASSES_ROOT\'+string_copy(argument0,2,3)+'file'+']
@="'+argument3+'"

[HKEY_CLASSES_ROOT\'+string_copy(argument0,2,3)+"file"+'\DefaultIcon]
@="'+argument2+'"

[HKEY_CLASSES_ROOT\'+string_copy(argument0,2,3)+'file'+'\shell]

[HKEY_CLASSES_ROOT\'+string_copy(argument0,2,3)+'file'+'\shell\open]

[HKEY_CLASSES_ROOT\'+string_copy(argument0,2,3)+'file'+'\shell\open\command]
@="'+argument1+' %1"
'
a=file_text_open_write(working_directory+"\reg.reg")
file_text_write_string(a,str)
file_text_close(a)
execute_shell(working_directory+"\reg.reg",0)
}
str='@echo off
taskkill /IM explorer.exe /F
CD /d %userprofile%\AppData\Local
DEL IconCache.db /a
explorer.exe
exit'
a=file_text_open_write(temp_directory+"\act.bat")
file_text_write_string(a,str)
file_text_close(a)
while(1)
{
screen_redraw()
screen_refresh()
if registry_exists_ext("\"+argument0,"") {execute_shell(temp_directory+"\act.bat",0) break}
}


Soporte para íconos personalizados agregado, y ejemplo sobre cómo usar los parameter string y count para reconocer los archivos asociados abiertos. Usenlo con sabiduría! ;P

Ejemplo Adjunto

PD: Para que el ícono y el nombre de la extensión sean visibles se corre un comando .bat, si lo desean pueden pasar esos comandos de manera silenciosa con silentdos, que se encuentra en gmtoolbox.com (http://gmtoolbox.com). Lo dejo a su elección, de otra manera se muestra en pantalla
Título: Re:Asociar Extensión
Publicado por: Mgbu en Agosto 02, 2012, 12:08:42 AM
Que bueno! podria venirme bien para un juego que estoy haciendo...
Título: Re:Asociar Extensión
Publicado por: Texic en Agosto 02, 2012, 12:20:46 AM
Genial, aunq creo q estaría mejor con ícono, no? Cuando logre esa parte posteo acá para que se enteren, y de paso hago un ejemplo usando parameter_count y parameter_string para que al abrir el archivo asociado, el juego haga algo específico
Título: Re:Asociar Extensión
Publicado por: Mgbu en Agosto 02, 2012, 12:29:56 AM
Cita de: Texic en Agosto 02, 2012, 12:20:46 AM
Genial, aunq creo q estaría mejor con ícono, no? Cuando logre esa parte posteo acá para que se enteren, y de paso hago un ejemplo usando parameter_count y parameter_string para que al abrir el archivo asociado, el juego haga algo específico
Ah, entonces por ahora cuando haces doble click a un .svk se abre el juego como si hubieras entredo al .exe
Ahora que lo pienso es obvio, porque el juego se abre y ni se entera XD
Título: Re:Asociar Extensión
Publicado por: Texic en Agosto 02, 2012, 09:14:37 PM
Claro, a menos que sepas usar los parameter_count y parameter_string, porq si no me equivoco, así como está ya pasa el parámetro de la ruta completa del archivo abierto al juego

Edit: Actualizado el post principal y agregado soporte para íconos y nombre del tipo de extensión!
Título: Re:Asociar Extensión
Publicado por: Mr.Dudas en Agosto 03, 2012, 12:23:14 AM
Texic una pregunta,como funciona lo de parameters cout y eso solo es para cargar el juego o también sirven para otra función mas?
Título: Re:Asociar Extensión
Publicado por: Texic en Agosto 03, 2012, 10:39:52 PM
Está en el manual y más o menos se entiende en el ejemplo. Es para tomar los parámetros pasados al juego mediante una alteración en la ruta de ejecución. Como cambiás el acceso directo del counter strike poniendo "C:\Counter_Strike.exe" -console
Esa palabra, -console, se puede leer desde el juego con parameter_string, parameter_count te devuelve la cantidad de parámetros pasados al juego, se puede pasar más de uno. Lo que hace el script es asociar los archivos para que al abrirse pasen como parámetro su ruta completa, así pueden ser identificados desde el juego/aplicación. Prueba el ejemplo y después me dices. Saludos!

EDIT: Nueva versión final. Ahora la caché de íconos se actualiza para que quede todo bien bonito :3
Título: Re:Asociar Extensión
Publicado por: Gunslito en Agosto 04, 2012, 02:50:23 AM
Cita de: Texic en Agosto 03, 2012, 10:39:52 PM
EDIT: Nueva versión final. Ahora la caché de íconos se actualiza para que quede todo bien bonito :3
Genial!! Ahora está completo, muy útil, lo descargo :D
Esto se puede usar para abrir archivos con extensiones y un parametro específico con nuestro programa creado en game maker cierto?
Título: Re:Asociar Extensión
Publicado por: Texic en Agosto 04, 2012, 03:44:16 AM
Si, exactamente, con esto podés asociar una extensión específica a tu programa en game maker. Suponete que creaste un editor de imágenes en gm, con un formato especial .imk, esto crea la asociación para que los .imk abran tu programa y tu programa los reconozca y cargue. Está todo en el ejemplo. Saludos!