|
novembre 2005 Blog Posts
Chi di voi è certificato, almeno MCP come me, sa che è
possibile fare ordini sul sito mcpestore.com, che vende gadget, t-shirt, materiale
d'ufficio e molto altro, tutto marcato dal logo MCP o dal più generico
Microsoft. Beh, non ho resistito alla tentazione, come magari molti di voi a
vostro tempo.
La cosa interessante è che io ho fatto l'ordine sabato sera (verso le
23, più o meno), dopo aver passato il pomeriggio a sfogliare il catalogo
online con mia mamma (ebbene sì, anche lei! ), mio fratello e la mia sorellina "adottiva"
Sabrina. C'è stato solo il lunedì di mezzo. Ieri mattina...
Con l'avvento di SQL Server 2005, molti miei clienti
hanno deciso di adottarlo come loro database aziendale, complice il fatto che
come ben sappiamo esiste la versione Express Edition
completamente gratuita. Ai tempi, avevo detto a tutti che c'era anche MSDE, ma
chissà perchè sono sempre stati un po' riluttanti, forse per la mancanza di
qualche tool grafico per rendere più comprensibile il lavoro.
Adesso, con il 2005, le cose sono ben diverse. Oggi, quindi, mi ritrovo ad
aver a che fare per la prima volta con Management Studio ed i
nuovi DTS, che cadono sotto il nome di Integration Services....
Per la serie "il cane che si mangia la coda",
ho appena trovato questo sito che magari può essere utile a chi cerca le
specifiche degli RSS-feed che si stanno sempre più diffondendo con l'avvento dei
blog e dei podcasting. Il sito è http://www.rss-specifications.com.
Ho passato il sabato sera in casa-casetta, con fuori che nevica. Ieri notte
ho fatto le ore piccole, mi sento un po' il fuso orario che mi perseguita,
allora eccomi qua.
powered by IMHO 1.3
Ho scaricato questo bel programma per disegnare reti. Si
chiama Smart Draw e potete trovarlo qui. Purtroppo
non è freeware, mi pare costi qualcosa come 147 dollari. Siccome a me non serve
più di tanto, ho scaricato la demo e mi sono messo a disegnare la LAN che, nel
corso degli anni, mi sono costruito a casa. Ci sono i miei PC desktop, i miei
notebook, stampanti, palmari e cellulari. Il programma è davvero completo, ha un
sacco di immagini vettoriali per molte periferiche, dall'informatica più
classica ai ponti radio e cose del genere. Beh, che ne pensate?
powered by...
Ieri sera, con molta sorpresa, ho ricevuto il mio Welcome
Kit per essere diventato MCP! Sono molto contento, ho subito infilato la mia
wallet card nel portafoglio e, giusto per fare il figo, la farò vedere a
chiunque mi passi sotto il naso!
So che molti di voi magari essere MCP non è nulla, però per
me è fonte di soddisfazione. In attesa, quando le acque si saranno calmate, di
ricominciare a studiare per sostenere gli altri esami. Continuo a ricevere
tutt'oggi molti commenti sui miei post relativi ad MCAD scritti durante il periodo di preparazione.
Volevo ringraziare pubblicamente, senza...
Molti lo definiscono un problema serio. Anche io lo
definisco un problema serio: quando ogni weekend muoiono un sacco di ragazzi e
ragazze perchè vanno a sbattere contro un albero, finiscono fuori strada, si
addormentano al volante, il problema deve essere per forza serio, non vi pare?
Però, e questo io non lo capisco proprio, perchè deve essere risolto in modo
così stupido parlando di velocità media? Cosa c'entra la velocità media? Quindi, praticamente, posso superare
i 130km/h a patto che poi in un altro tratto di strada vado
a 90km/h, oppure mi fermo in un autogrill per prendere un...
UGIdotNET tratta prevalentemente di mondo Microsoft, di
.NET ed affini, però nulla toglie all'altra faccia della medaglia,
quella di open-source, di Linux, di mondo libero, insomma. Oddio, diciamocela
tutta: anche se io non sono proprietario dei sorgenti di Windows, anche se non
sono libero di vedere il codice di MSCOMCTL32.OCX, anche se non posso
ricompilare il kernel alla release 7.8.2.3.49.00023.5133 beta 2, io così tanto
prigioniero non mi sento.
Tutto questo (folle) preambolo per dire che sabato 26
novembre è il Linux Day, evento che arriverà
in quasi 100 città in tutta Italia. Mi fa piacere sapere che
anche la mia...
Faccio parte di UGIdotNET, una bella
community, devo dire. Vi avevo messo al corrente, poco tempo fa, che stavo per prendere un nuovo
cellulare. Non intendendomene affatto, ho chiesto consiglio su forum, newsgroup
e, appunto, sfruttando il mio blog di UGI. Ho ricevuto consigli spassionati
ed aiuti dal mio ominimo
Igor, da Eleonora, da colleghi e da altri amici. Ero partito dal voler
prendere un Sony-Ericsson, ma alla fine mi sono convinto a voler prendere un
Nokia 6630.
L'ho preso lunedì sera e devo dire che mi trovo piuttosto bene. Ho già
installato qualche software per Symbian 60 che ho trovato in giro...
Tratto da http://einsteinathome.org:
"One way to visualize the importance of detecting gravitational waves is
to think of the universe as a movie and gravity waves as sound. By studying the
movie with light, we can see what happens. By studying the movie with sound, we
can hear what happens. Although each of these methods gives us some information
on the storyline, we can only really understand what is happening when we can
see and hear the movie at the same time. This is why scientists are so excited
about being able to study the universe with gravitational waves and light
waves."
La...
Un certo James Avery scrisse - a quanto pare un anno fa - un
articolo intitolato ".NET Tools: Ten Must-Have Tools Every Developer Should Download
Now". Devo aver letto qualche post qui su UGIdotNET, però ricordo di aver
trovato NUnit ed altri tool. Stavo curiosando sulle pagine di MSDN
Magazine di Dicembre 2005 e ho trovato questo secondo articolo, sempre
dallo stesso autore, che ripropone lo stesso tema, aggiornando però il
contenuto con quanto è possibile trovare oggi in Rete.
L'articolo si intitola "Visual Studio Add-Ins Every Developer Should Download
Now". Ci sono i classici tool per il debugging e per la generazione
automatica del codice. Sembra...
continua dal post precedente
Sasser non era mai stato così sicuro come in questo
momento. Sapeva che l'OS aveva già rilevato la sua presenza, ma nonostante
questo era conscio e ben sicuro di quello che stava per fare. L'entità si
trovava in un posto al sicuro all'interno della RAM del sistema: non che l'OS
non potesse rilevarla, però la memoria era così vasta che c'era una minima
probabilità che qualche scanner capitasse proprio in quel punto. Voleva
agire alla svelta, perchè così voleva il suo codice interno. Un malicious
code è un'entità semplice, elementare e nemmeno molto estesa in termini di...
Se per qualche minuto fa Google fosse
irraggiungibile, la prima cosa che mi direi sarebbe: "Pazienza, mio troppo
giovane Padawan!". Probabilmente la seconda cosa sarebbe: "Ma è un
problema di Google oppure è la mia connessione?". Il tempo di pensare a
come superare il problema, et voilà, il problema si risolverebbe da solo,
proprio perchè non dipende da noi!
Invece eri deve essere scoppiato il panico, perchè Google e tutti i suoi
servizi sono stati irraggiungibili per un po' di tempo? Voi ve
ne siete accorti? Io dico che può succedere, non capisco il motivo di tanto
clamore!
powered by IMHO...
Chi segue il mio blog sa che sto preparando un freeware
(HappySign) di cui ho già
parlato sul mio sito ed in alcuni post, appunto, del mio blog. Per la serie
"avrei voluto farlo tranquillamente nel tempo libero", ho dovuto
rallentare un attimo. Di mezzo ci sono stati il compleanno di
mio fratello (festeggiato in due serate diverse), quello di mio papà,
qualche stress di troppo causato dal lavoro ed altri fattori che mi hanno fatto
continuamente traslare, chiamiamola così, la data di uscita di HappySign.
Non solo: ho avuto un po' di richieste e suggerimenti, prima fra
tutte la possibilità di scrivere le...
La delusione della SMAU di quest'anno è stata almeno parzialmente mitigata
dall'acquisto di Quake 4, ultimo videogioco
della mitica e mai dimenticata ID Software.
Ieri sera, prima di andarmene a letto, ho sconfitto il Makron, distrutto
il Nodo e salvato la Terra dalla minaccia aliena. Non so se ve ne rendete conto,
ma questa mattina, dovete tutti ringraziarmi se siete ancora vivi, sani e salvi
nelle vostre case, e se avete ancora un lavoro e una famiglia.
A parte scherzi, ci ho messo un mesetto per finirlo, e devo dire che per un
gioco d'azione è più che sufficiente. Utilizza lo stesso motore...
Dopo il sondaggio indetto da Alessio e la sua nuova auto, aiutate anche
me?
Non me ne intendo di cellulari, lo confesso. Parlatemi di PC, di palmari, di
lettori CD e DVD, persino di macchinette del caffè o lavatrici, ma
lasciate stare con i cellulari. Purtroppo, oggi è quasi un oggetto
indispensabile. Il mio buon vecchio Siemens M50, acquistato nell'estate 2002, mi
sta lasciando: si spegne improvvisamente senza motivo, mi dà strani messaggi sul
display, più altri malfunzionamenti non meglio precisati.
Sono appena tornato da un po' di shopping per farmi un'idea. Ho bisogno di un
cellulare che abbia le seguenti caratteristiche:
...
Sono disgustato dal fatto che un certo Daniele Interrante, idolo delle
ragazzine e di chissà quante persone, possa dire su Rai Uno, in prima serata,
che 1/3 * 3 faccia 3, e non 1.
Onestamente, sono anche disgustato dal fatto che la stessa persona creda che
la Terra sia divisa in soli 2 fusi
orari, e non 24 come è veramente.Sono disgustato dal fatto
che la vincitrice dell'Isola dei Famosi, ex-star del mitico Drive-In, abbia
dichiarato, subito dopo la vittoria: "Adesso, magari, mi rifaccio il
seno!".Sono disgustato
perchè in 3 spot in TV (una di un'automobile, una di una nota
compagnia telefonica...
Ho trovato questo articolo su MSDN Magazine. E' un
articolo scritto da un certo Bryan Noyes , del maggio 2004, ma
io l'ho trovato solo oggi: ci vuole abilità e capacità anche per questo, no??
A
parte scherzi, evidenzia vantaggi & svantaggi nell'utilizzo di Click
Once
per il deploy delle applicazioni
.NET.
Dice espessamente, tra le altre cose, che le
applicazioni distribuite attraverso Click Once vengono
scaricate ed installate in una cache privata (questo già lo sapevo), allo scopo
di rimanere isolate il più possibile dalle altre applicazioni già
presenti sul PC....
Nel periodo 2003-2004 ho lavorato presso una società a
Milano che sviluppa software per la pubblica amministrazione, inteso come uffici
comunali, asili, scuole elementari, ASL, etc. etc. Tra le altre cose, per un
certo periodo mi ero occupato di esportare un file XML che potesse rappresentare
lo stato anagrafico/sociale/economico/giuridico di una certa persona. In
pratica, mi sono inventato di sana pianta uno schema XSD che mi aiutasse a
generare il file XML, che mi permettesse la validazione e così via. Il file XML
finale era un grande contenitore con:
dati anagrafici (cognome, nome, nascita, eventuale morte)
dati sul...
La mia macchina digitale funziona, ma quando si tratta
di fare foto al chiuso, diventa orribile. Così, questa sera me la sono
fatto prestare da un mio amico. Ho scattato, per puro divertimento, qualche foto
di camera mia. Perchè non condividerle con i miei amici di UGIdotNET?
Il mio letto invaso dai 6 film completi della saga,
videogiochi. In alto a sinistra si intravedono 2 fumetti che ho preso a
Lucca.C'è anche un C1P8 (o R2D2 che dir si voglia) ribaltato!!
La mia scrivania (ho preferito cancellare un pezzo
del calendario di Giorgia Palmas)Monitor da 19", in alto a sinistra si intravedono...
Avevo scritto sul mio blog qualche tempo fa un post dove segnalavo
qualche problema nel creare un hook usando il nuovo framework 2.0. Avevo scritto
qualcosa anche sul newsgroup di UGI proprio per questo problema: purtroppo non
ricordo chi, ma mi avevano detto che usavo dichiarazione API non corrette,
oppure che c'era qualche altro problema nel codice.
Mi fa piacere sapere che non sono l'unico al mondo a non essere riuscito, o
che comunque ha trovato qualche differenza tra FW1.1 e FW2.0. Proprio adesso ho
letto un post sul blog di MSDN (di un certo Srivatsn,
dai...su....ditemi che conoscete anche lui...
The term service is
used to indicate any external software component that provides business
services. This includes, but is not limited to, XML Web Services. Services
expose a service interface to which all
inbound messages are sent. The definition of the set of messages that must be
exchanged with a service in order for the service to perform a specific business
task constitutes a contract.
powered by IMHO 1.2
Ore 6:55, mi sollevo dal letto e mi butto sotto la
docciaOre 7:10, faccio colazione (latte + biscotti)Ore 7:32, mi siedo in
macchinaOre 7:35, raggiungo il mio amico con cui condivido
l'auto davanti a casa suaOre 7:44, Centro Commerciale Bennet, Pieve
Fissiraga (LO), per fare benzina al self-serviceOre 7:45, ci accorgiamo che
l'impianto è fuori usoOre 7:45,
proclamo: "Dai, entriamo in autostrada e faccio benzina all'Autogrill"Ore
7:49, raggiungiamo l'Autogrill sulla A1, San Zenone al LambroOre 7:51, mi
posiziono con l'auto alla pompa di benzina ServitoOre 7:59, NON HO ancora fatto benzina...che fine ha fatto
l'omino?????Ore 8:05, mi posiziono con l'auto alla...
E' di questi giorni la notizia che Sony ha inserito in
alcuni CD musicali un rootkit, un software/driver che viene installato
automaticamente quando si fa il play del CD. Ho trovato questi due articoli
scritti da un certo Mark che a quanto pare è quello che ha fatto scatenare
il putiferio in tutto il globo.
Gli articoli sono questi:More on Sony: Dangerous Decloaking Patch, EULAs and Phoning
HomeSony’s Rootkit: First 4 Internet Responds
Vi consiglio la lettura, perchè oltre a parlare di EULA e di aspetti legali,
fa vedere chiaramente alcuni dettagli tecnici che dimostrano come Sony non si
sia fatta veramente scrupoli...
Il bus a 32 bit era minaccioso, oscuro e silenzioso, illuminato a tratti da lampi blu e
da sequenze di dati che lo percorrevano in tutta la sua lunghezza. Nonostante si
trovasse in un ambiente ostile e che percepiva come nemico, il byte sapeva esattamente quello che
doveva fare in quel sistema esterno. Non si trovava lì per caso,
e quella per lui non era certo una vacanza-premio o chissà cosa. La missione che
gli era stata affidata dal suo OS era chiara e ben definita. Non aveva
alcuna intenzione di deluderlo, nè soprattutto di deludere se stesso. Aveva preso
parte a...
La vera sicurezza è la nostra intelligenza,
accompagnata dal buonsenso. Tutto il resto è
limitazione.
powered by IMHO 1.2
Sto facendo esperimenti con C# per l'interfacciamento con
WMP per cercare di capire come ottenere informazioni sul file che si sta
playando. Non è affatto complicato, anzi, come al solito è molto
divertente.
Bisogna innanzitutto aggiungere nei references il file
wmp.dll, parte integrante di WMP. A questo punto abbiamo a
disposizione tutto l'object model con cui possiamo veramente fare di tutto: fare
il play di un file, enumerare le playlist, crearne di nuove, controllare il
lettore con i semplici play/stop/pause, skinnare l'applicativo e via
dicendo.
Ad esempio, se volessimo sapere quante playlist sono state definite...
player = new WMPLib.WindowsMediaPlayer();WMPLib.IWMPPlaylist lista;WMPLib.IWMPPlaylistCollection coll = player.playlistCollection;WMPLib.IWMPPlaylistArray arr = coll.getAll();int howmany = arr.count;for(int i=0;i<howmany;i++){ lista = arr.Item(i); Debug.WriteLine(lista.name + " : " +
lista.count);}
Dichiaro un...
Proposte cinematografiche per questo weekend (tratte
direttamente da http://www.multiplexarcadia.com,
l'unico cinema che per me ha senso di esistere):
Flightplan - Mistero in volo
Elizabethtown
I Fratelli Grimm e L’Incantevole Strega
In her shoes
La Sposa Cadavere
Texas
Mio fratello questa sera vuole passare una serata a vedersi un bel film, ma
francamente non saprei cosa consigliare. Mi hanno detto che "La Sposa
Cadavere" è bello, ma non mi ha mai ispirato, perciò fate voi.
Conoscendo il debole che ha mio fratello per Cameron Diaz,
probabilmente ci butteremo su "In her
shoes", classica commedia americana che...
In un mio vecchio post parlavo di come avessi adottato
Thunderbird come [mail-news-blog] reader. Lo ritengo comodo e molto funzionale.
Una cosa di cui mi sono accorto durante l'utilizzo reale, sul campo, è che Thunderbird memorizza le configurazioni sui filtri nelle cartelle
dedicate ai propri account, e non in altri posti strani e pericolosi
(leggesi registro, per esempio). Risultato? Che se per caso
formattate il PC, ve lo ritrovate tutte belle già configurate quando reimpostate
TB facendolo puntare alle cartelle pre-esistenti. Io, per esempio, mi sono
creato un filtro che preleva tutte le e-mail in ingresso che iniziano con la...
Premetto che questo è il mio post numero 200....EVVIVA!!!
Nel mio ultimo post ho parlato di un metodo spartano,
brutale e poco consigliabile per generare un file XML in cui salvare le
impostazioni di una qualsiasi nostra applicazione. Il metodo che ho scritto,
sebbene funzioni, ha suscitato qualche reazione negativa, perchè come
giustamente è stato osservato non è assolutamente il modo
migliore per serializzare su XML. In questo post, dopo averci ragionato
su per circa 24 ore, propongo il metodo più politically-correct, quello migliore ed
adatto a sfruttare meglio le capacità del framework.
Ovvero, sfruttare i namespace...
Come ho detto, io non ci sono. Però ho mandato in rappresentanza mio fratello
Omar, anche
lui UGIdotNET. Mi dice che l'ambiente è molto bello - io purtroppo non
ci sono mai stato...mi ha descritto stand di UGIdotNET (e ci mancherebbe altro!
), Edizioni Master, ObjectWay. 2500
presenze contate, alle 16:30 - se ho ben capito - verranno distribuite
copie di Visual Studio 2005 e SQL Server 2005. Le presenze sono un po' di più di
quello che ci si aspettava, quindi penso sarà dura avere una copia:
ordino a mio fratello di non spingere, di comportarsi bene, di
non provocare...
Qualche minuto fa, ho annullato la mia iscrizione alla
giornata di domani. Questa settimana, da domenica scorsa ad
oggi, è proprio da dimenticare. Prima il mio cagnolino, poi .NET che mi fa
impazzire, poi il lavoro che mi fa correre. Quindi, da qualche minuto c'è un
posto in più per chi si vuole registrare in extremis. Che tristezza!
powered by IMHO 1.2
Una citazione da un grandissimo film degli anni '80 diceva:"Strano gioco. L'unica mossa vincente è non
giocare."Chi indovina, vince un premio - non ho ancora
deciso cos'è!
Mi è venuto in mente anche un buon mio amico/nostro collega, che invece di
usare librerie pre-esistenti, preferiva cominciare da zero e farsele da sè. E'
esattamente quello che alla fine ho deciso io per il mio problema riguardante i
settings della mia applicazione HappySign. Ho creato una classe
Settings che espone tutta una serie di membri che sono poi i
settings che voglio usare nella mia applicazione. Ecco un piccolo estratto di...
Vedo che ho ricevuto un sacco di proteste per la mia
voglia di usare app.config per leggere e salvare le
applicazioni di HappySign. Sappiate che lotterò duramente e con tutte le mie
forze: posso anche avere torto, ma non me ne importa nulla, l'importante è
credere in quello che si dice. Non capisco perchè .NET metta un bel tappeto
rosso a chiunque voglia leggere i settings dal file
app.config, ma poi attui la politica "lì ci puoi solo leggere", "l'utente non ha i
permessi di scrittura su C:\Programmi\<nomeapp>", "non è il posto giusto",
bla bla bla. Mi sembra un po' quello...
Ieri mattina, prima che succedesse il fattaccio che ha scombussolato il
tranquillo tran-tran familiare
, ho portato
HappySign a buon punto. Sabato mattina, di
buon'ora, ho messo a punto la possibilità di creare le famigerate firme
dinamiche, che funzionano davvero bene. Con qualche colpo di codice .NET
(rigorosamente in VB.NET) ho creato un paio di firme dinamiche simpatiche e
divertenti. La prima va a leggere il file
XML dell'RSS-feed
...
Dedicato a Jolly, il cane che è
stato il miglior amico della mia famiglia dall'estate 1990.Oggi, stanco, ha
deciso di lasciarci.
Il byte ne aveva passate di cotte e di crude.Pensò a quella volta che si
imbattè per la prima volta in un firewall: il software firewall voleva
respingerlo, eliminarlo perchè lo considerava un byte pericoloso. Lui riuscì ad
aggirarlo: aggregandosi con altri bytes, formò un costrutto di codice e ad
oltrepassare le regole imposte e ad entrare nel sistema.Pensò a quando
correva veloce, lungo i bus di sistema, portando informazioni da una parte
all'altra del sistema senza perdere un colpo.Pensò...
Inganno il tempo che mi rimane qui al lavoro per
illustrare un attimo come ho intenzione di implementare la feature di firma
dinamica nel mio HappySign. La classe
Sign è il fulcro di tutto: essa contiene proprietà come Name,
Author, Category, Dynamic e Code (oltre a diverse altre che adesso non
interessano).Quella che ci riguarda è proprio quest'ultima,
Code.
Se Dynamic = false, allora Code
contiene banalmente una string. Questa string è quella
che viene trascinata o incollata. Niente di più semplice. Già testato.
Se Dynamic = true, le cose si fanno più complesse.
Se la firma è dinamica, devo associargli una classe
contenente codice .NET...
Ecco uno dei rari weekend che si preannuncia vuoto e desolato di eventi. Non
so quello che farò, cosa combinerò, quale parte del mondo mi vedrà protagonista.
Lo so, soffro di manie di grandezza. Probabilmente, improvviserò qualcosa con
gli amici. Magari alla fine questi sono i weekend migliori, non ci si aspetta
nulla di particolare, e allora vengono fuori le cose migliori. Mi sa che dovrò
incontrarmi con Flavio & Stefania ("chi sono?" - vi chiedete voi - "affari
miei!" - rispondo io ): a Lucca, la settimana scorsa, ho
acquistato per conto suo un volumetto intitolato "Thor
e i Nuovi Vendicatori"...
Ieri sera mi sono messo davanti al codice del mio
HappySign che pian piano sta
vedendo la luce. Tra le varie migliorie, ho intenzione di aggiungere una
funzionalità che permette di associare una certa combinazione di tasti ad una
certa firma. Per esempio, sto scrivendo un'e-mail con Outlook Express, premo
CTRL+F6 e lui mi aggiunge automaticamente la firma "Asta la vista, baby...".
Per farlo, occorre ovviamente implementare e gestire un hook sulla tastiera a
livello di sistema. In Rete ho trovato tanti esempi e tanto codice. Io mi sono
fissato ad utilizzare la classe UserActivityHook riportata qui
sotto:
using System;using System.Runtime.InteropServices;using System.Reflection;using System.Threading;using System.Windows.Forms;namespace HappySign { /// <summary> /// This class allows you to tap keyboard and mouse and / or to detect their activity even when an /// application runes in background or does not have any user interface at all. This class raises /// common .NET events with KeyEventArgs and MouseEventArgs so you can easily retrive any information you need. /// </summary> /// <remarks> /// created by - Georgi /// created on - 22.05.2004 13:08:01 /// </remarks> public class UserActivityHook : object { /// <summary> /// Default constructor - starts hooks automatically /// </summary> public UserActivityHook() { Start(); } ~UserActivityHook() { Stop(); } public event MouseEventHandler OnMouseActivity; public event KeyEventHandler KeyDown; public event KeyPressEventHandler KeyPress; public event KeyEventHandler KeyUp; public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam); static int hMouseHook = 0; //Declare mouse hook handle as int. static int hKeyboardHook = 0; //Declare keyboard hook handle as int. //values from Winuser.h in Microsoft SDK. public const int WH_MOUSE_LL = 14; //mouse hook constant public const int WH_KEYBOARD_LL = 13; //keyboard hook constant HookProc MouseHookProcedure; //Declare MouseHookProcedure as HookProc type. HookProc KeyboardHookProcedure; //Declare KeyboardHookProcedure as HookProc type. //Declare wrapper managed POINT class. [StructLayout(LayoutKind.Sequential)] public class POINT { public int x; public int y; } //Declare wrapper managed MouseHookStruct class. [StructLayout(LayoutKind.Sequential)] public class MouseHookStruct { public POINT pt; public int hwnd; public int wHitTestCode; public int dwExtraInfo; } //Declare wrapper managed KeyboardHookStruct class. [StructLayout(LayoutKind.Sequential)] public class KeyboardHookStruct { public int vkCode; //Specifies a virtual-key code. The code must be a value in the range 1 to 254. public int scanCode; // Specifies a hardware scan code for the key. public int flags; // Specifies the extended-key flag, event-injected flag, context code, and transition-state flag. public int time; // Specifies the time stamp for this message. public int dwExtraInfo; // Specifies extra information associated with the message. } //Import for SetWindowsHookEx function. //Use this function to install a hook. [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); //Import for UnhookWindowsHookEx. //Call this function to uninstall the hook. [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] public static extern bool UnhookWindowsHookEx(int idHook); //Import for CallNextHookEx. //Use this function to pass the hook information to next hook procedure in chain. [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam); public void Start() { // install Mouse hook if(hMouseHook == 0) { // Create an instance of HookProc. MouseHookProcedure = new HookProc(MouseHookProc); hMouseHook = SetWindowsHookEx( WH_MOUSE_LL, MouseHookProcedure, Marshal.GetHINSTANCE( Assembly.GetExecutingAssembly().GetModules()[0]), 0); //If SetWindowsHookEx fails. if(hMouseHook == 0 ) { Stop(); throw new Exception("SetWindowsHookEx failed."); } } // install Keyboard hook if(hKeyboardHook == 0) { KeyboardHookProcedure = new HookProc(KeyboardHookProc); hKeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE( Assembly.GetExecutingAssembly().GetModules()[0]), 0); //If SetWindowsHookEx fails. if(hKeyboardHook == 0 ) { Stop(); throw new Exception("SetWindowsHookEx ist failed."); } } } public void Stop() { bool retMouse =true; bool retKeyboard = true; if(hMouseHook != 0) { retMouse = UnhookWindowsHookEx(hMouseHook); hMouseHook = 0; } if(hKeyboardHook != 0) { retKeyboard = UnhookWindowsHookEx(hKeyboardHook); hKeyboardHook = 0; } //If UnhookWindowsHookEx fails. if (!(retMouse && retKeyboard)) throw new Exception("UnhookWindowsHookEx failed."); } private const int WM_MOUSEMOVE = 0x200; private const int WM_LBUTTONDOWN = 0x201; private const int WM_RBUTTONDOWN = 0x204; private const int WM_MBUTTONDOWN = 0x207; private const int WM_LBUTTONUP = 0x202; private const int WM_RBUTTONUP = 0x205; private const int WM_MBUTTONUP = 0x208; private const int WM_LBUTTONDBLCLK = 0x203; private const int WM_RBUTTONDBLCLK = 0x206; private const int WM_MBUTTONDBLCLK = 0x209; private int MouseHookProc(int nCode, Int32 wParam, IntPtr lParam) { // if ok and someone listens to our events if ((nCode >= 0) && (OnMouseActivity!=null)) { MouseButtons button=MouseButtons.None; switch (wParam) { case WM_LBUTTONDOWN: //case WM_LBUTTONUP: //case WM_LBUTTONDBLCLK: button=MouseButtons.Left; break; case WM_RBUTTONDOWN: //case WM_RBUTTONUP: //case WM_RBUTTONDBLCLK: button=MouseButtons.Right; break; } int clickCount=0; if (button!=MouseButtons.None) if (wParam==WM_LBUTTONDBLCLK || wParam==WM_RBUTTONDBLCLK) clickCount=2; else clickCount=1; //Marshall the data from callback. MouseHookStruct MyMouseHookStruct = (MouseHookStruct) Marshal.PtrToStructure(lParam, typeof(MouseHookStruct)); MouseEventArgs e=new MouseEventArgs( button, clickCount, MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y, 0 ); OnMouseActivity(this, e); } return CallNextHookEx(hMouseHook, nCode, wParam, lParam); } //The ToAscii function translates the specified virtual-key code and keyboard state to the corresponding character or characters. The function translates the code using the input language and physical keyboard layout identified by the keyboard layout handle. [DllImport("user32")] public static extern int ToAscii(int uVirtKey, //[in] Specifies the virtual-key code to be translated. int uScanCode, // [in] Specifies the hardware scan code of the key to be translated. The high-order bit of this value is set if the key is up (not pressed). byte[] lpbKeyState, // [in] Pointer to a 256-byte array that contains the current keyboard state. Each element (byte) in the array contains the state of one key. If the high-order bit of a byte is set, the key is down (pressed). The low bit, if set, indicates that the key is toggled on. In this function, only the toggle bit of the CAPS LOCK key is relevant. The toggle state of the NUM LOCK and SCROLL LOCK keys is ignored. byte[] lpwTransKey, // [out] Pointer to the buffer that receives the translated character or characters. int fuState); // [in] Specifies whether a menu is active. This parameter must be 1 if a menu is active, or 0 otherwise. //The GetKeyboardState function copies the status of the 256 virtual keys to the specified buffer. [DllImport("user32")] public static extern int GetKeyboardState(byte[] pbKeyState); private const int WM_KEYDOWN = 0x100; private const int WM_KEYUP = 0x101; private const int WM_SYSKEYDOWN = 0x104; private const int WM_SYSKEYUP = 0x105; private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) { // it was ok and someone listens to events if ((nCode >= 0) && (KeyDown!=null || KeyUp!=null || KeyPress!=null)) { KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct) Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct)); // raise KeyDown if ( KeyDown!=null && ( wParam ==WM_KEYDOWN || wParam==WM_SYSKEYDOWN )) { Keys keyData=(Keys)MyKeyboardHookStruct.vkCode; KeyEventArgs e = new KeyEventArgs(keyData); KeyDown(this, e); } // raise KeyPress if ( KeyPress!=null && wParam ==WM_KEYDOWN ) { byte[] keyState = new byte[256]; GetKeyboardState(keyState); byte[] inBuffer= new byte[2]; if (ToAscii(MyKeyboardHookStruct.vkCode, MyKeyboardHookStruct.scanCode, keyState, inBuffer, MyKeyboardHookStruct.flags)==1) { KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]); KeyPress(this, e); } } // raise KeyUp if ( KeyUp!=null && ( wParam ==WM_KEYUP || wParam==WM_SYSKEYUP )) { Keys keyData=(Keys)MyKeyboardHookStruct.vkCode; KeyEventArgs e = new KeyEventArgs(keyData); KeyUp(this, e); } } return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); } }}
Con il framework 1.1...
Durante il weekend ho migrato il mio freeware HappySign (HS) dal framework 1.1 al nuovo framework 2.0, usando gia' alcuni controllo nuovi di zecca (come - se ricordo bene - il MenuStrip). Le caratteristiche di base ci sono gia' tutte. Al posto di parlare di firme, ho preferito usare il termine decorazioni per firme. L'idea e' questa: voi impostate nel vostro mail-reader la firma classica, che riporta nome, cognome, indirizzo e-mail, URL del vostro blog e via dicendo. Poi usate il mio HS per decorare la firma, aggiungendo qualche frase che vi piace.
Come dicevo, le caratteristiche base sono gia' (quasi tutte)...
27 Ottobre 2005, ore 18:45 UTCIn uno dei tanti Server Web
Microsoft....
Il servizio IIS girava tranquillamente da qualche settimana. Ben bilanciato
ed ottimizzato, IIS riceveva un'enorme quantità di bytes in ingresso, e una
quantità ancora più grande era formata dai files che il servizio aveva
restituito ai driver di rete per poter essere inviati al client. L'interno del
server era tutto sommato piuttosto tranquillo, in questo momento: l'80% delle
informazioni richieste erano già state tutte inserite nella cache di sistema.
L'hard-disk, inserito in un sistema RAID, era fermo e quasi completamente
inutilizzato.
In uno dei tanti bus di sistema in RAM,...
Mi sono improvvisamente ricordato di una certa tecnologia presente in Visual Studio 2005 che aveva fatto vedere - se ricordo bene - Corrado nella sua sessione all'ultimo SMAU. Mi stavo rivedendo il suo webcast per dare un'occhiata alle slide e per ascoltare quello che diceva per cercare di ricordarmi il nome. Ecco infatti che nella slide delle novità di Visual Basic 2005 compare una voce: ClickOnce Deployment. Data la parola chiave, ecco che tutto si fa più chiaro.
Ho trovato questi articoli che spiegano come usare ClickOnce per distribuire un'applicazione e per mantenerla aggiornata.
powered by IMHO 1.3
All'epoca in cui programmavo con Visual Basic 6.0
provenivo da vecchi Microsoft Access 2.0 e dalle versioni più vecchie di VB. Ho
sempre considerato l'IDE di Visual Basic 6.0 una manna dal cielo: l'Intellisense
era semplicemente strepitoso e il tooltip che compare quando ci si sofferma su
una variabile durante il debug era veramente utile, comodo e soprattutto
produttivo.
Tutto questo impallidisce di fronte a questo gioiello che risponda al nome di
Visual Studio 2005. Avevo già provato la beta 2 in
passato, ma avere la versione finale installata sul mio PC è gratificante. Fare debug con VS2005 è strepitoso. Il
tooltip...
|