Oppure

Loading
02/02/15 15:16
pbe
Ciao a tutti, non vorrei sembrare insistente ma sono ancora bloccato nello stesso problema che avevo postato, forse non molto chiaramente, giorni fa.

Rifaccio bene il post dando tutte le informazioni possibili, cercando di essere più chiaro possibile.
La situazione è questa:

Ho creato un programma che apre e modifica file di testo.
Ho cercato poi di associare l'estensione creata da me (.bee) con il mio programma come era spiegato in questo video: youtube.com/… .

Dopo aver adattato il codice nulla è cambiato ed il file non è associato. Ecco il codice completo del file Program.cs:
using System;
using System.Linq;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using Microsoft.Win32;

namespace Text
{
	/// <summary>
	/// Class with program entry point.
	/// </summary>
	internal sealed class Program
	{
		[DllImport("Shell32.dll", CharSet = CharSet.Auto, SetLastError=true)]
		public static extern void SHChangeNotify(uint wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);
		/// <summary>
		/// Program entry point.
		/// </summary>
		[STAThread]
		private static void Main(string[] args)
		{
			if(!IsAssociated())
			{
				
			}
			else
			{
				Associate();
			}
			Application.EnableVisualStyles();
                        Application.SetCompatibleTextRenderingDefault(false);
 
                       try
                       {
                            Application.Run(new MainForm(args[0].ToString()));
                       }
                       catch
                       {
                            Application.Run(new MainForm());
                       }
			
		}
		
		public static bool IsAssociated()
		{
		       return(Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.bee", false) == null);
		}
		public static void Associate()
		{
			RegistryKey fileReg = Registry.CurrentUser.CreateSubKey("Software\Classes\.bee");
			RegistryKey AppReg = Registry.CurrentUser.CreateSubKey("Software\Classes\Applications\Text.exe");
			RegistryKey AppAssoc =                          Registry.CurrentUser.CreateSubKey("Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.bee");
			
			fileReg.CreateSubKey("DefaultIcon").SetValue("",""+Application.StartupPath+"\icon.ico");
			fileReg.CreateSubKey("PerceivedType").SetValue("","Text");
			
			AppReg.CreateSubKey("shell\open\command").SetValue("","\""+Application.ExecutablePath + "\" %1");
			AppReg.CreateSubKey("shell\edit\command").SetValue("","\""+Application.ExecutablePath + "\" %1");
			AppReg.CreateSubKey("DefaultIcon").SetValue("",""+Application.StartupPath+"\icon.ico");
			AppAssoc.CreateSubKey("UserChoice").SetValue("Progid","Software\Classes\Applications\Text.exe");
			SHChangeNotify(0x08000000, 0x0000, IntPtr.Zero, IntPtr.Zero);
		}
		
	}
}



Tuttavia non riuscivo a trovare il problema...

Dopo un po' ho provato a mettere un semplice MessageBox nella funzione Associate() e all'avvio non appariva, perchè?
Ovviamente era perchè la funzione Associate() non veniva richiamata all'apertura.

Ho provato a sistemare un po' i codici ma niente... Anche se tolgo dal if-else iniziale la funzione e dichiaro subito all'inizio Associate() l'unico cambiamento è che mi associa l'icona al programma, ma nient'altro.

Sono ad un punto fermo, aspetto vostri consigli.
Grazie.
Ultima modifica effettuata da pbe 02/02/15 15:20
aaa
02/02/15 16:29
Roby94
Possibile che generi un eccezione?
Ti consiglierei di guardare i post di totem in questa discussione dove specifica quali chiavi di registro permettano l'associazione di un file ad un programma.
pierotofy.it/pages/extras/forum/16/20222-associare_estensione_icona_ad_applicazione/
aaa
02/02/15 18:03
Ci puoi commentare queste linee di codice ?

if(!IsAssociated())
{
                               
}
else
{
       Associate();
}
02/02/15 18:05
pbe
A me non sembra molto chiaro quel post, anche per il fatto che alla fine una soluzione non è stata trovata.

Poi non mi è chiaro il codice scritto da Totem:

 HKEY_CLASSES_ROOT\.asd
 HKEY_CLASSES_ROOT\.asd\(Predefinito) = ASDFile
HKEY_CLASSES_ROOT\ASDFile\Shell\Open\command\(Predefinito) = "C:\editor.exe" "%1"

In che modo posso modificare il mio codice?
La stranezza è che nel video (vi invito a vederlo) funziona perfettamente il codice mentre nel mio caso la funzione Associate() non parte nemmeno.

Ditemi cosa ne pensate, al più presto :)
aaa
02/02/15 18:11
pbe
Postato originariamente da nessuno:
Ci puoi commentare queste linee di codice ?

if(!IsAssociated())
{
                               
}
else
{
       Associate();
}


Secondo me non hanno alcun senso, in quanto dovrebbe essere:
if(IsAssociated())
{

}
else 
{
   Associate();
}
Tuttavia nel video (del quale mi ero fidato) l'errore di cui si era accorto era proprio di non aver messo il ! nell'if.

Il problema comunque non credo sia lì in quanto anche se cambio il codice e faccio eseguire la funzione Associate() non ottengo lo stesso alcun risultato.
Ultima modifica effettuata da pbe 02/02/15 18:13
aaa
02/02/15 18:26
Intanto quel codice deve essere semplicemente

if ( !IsAssociated() )
   Associate();


Se sei d'accordo, continuiamo con il resto.
02/02/15 18:34
pbe
D'accordissimo. (alla fine è uguale).

Continuiamo pure. Se qualcuno ha idee o soluzioni mi faccia sapere subito.
Ultima modifica effettuata da pbe 02/02/15 18:50
aaa
02/02/15 19:28
Continuando, nella funziona IsAssociated deve essere

!= null