2006-03-11
2006-02-23
abrir un fichero con process start
Primero lo intentamos abrir con "Process.Start", y luego usamos el handle que devuelve para poner la ventana delante. El problema es que si la aplicación ya estaba abierta, no devuelve nada así que lo que hacemos es buscar una ventana en cuyo título aparezca el fichero que queremos abrir...
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace cancelarConexiondeRed
{
/// <summary>
/// Descripción breve de Class1.
/// </summary>
class Class1
{
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern bool SetWindowPos(
IntPtr hWnd, // window handle
IntPtr hWndInsertAfter, // placement-order handle
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
uint uFlags); // window positioning flags
public const int HWND_TOP = 0x0;
public const int HWND_TOPMOST = -1;
public const int HWND_BOTTOM = 0x1;
public const uint SWP_NOSIZE = 0x1;
public const uint SWP_NOMOVE = 0x2;
public const uint SWP_SHOWWINDOW = 0x40;
[DllImport("user32.dll")]
static extern IntPtr SetActiveWindow(IntPtr hWnd);
[DllImport("user32.dll", SetLastError=true)]
static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
[STAThread]
static void Main(string[] args)
{
Process ventana = Process.Start(@"u:\teclas.txt");
Console.ReadLine();
if (ventana!=null)
SwitchToThisWindow(ventana.MainWindowHandle, true);
else
{
Process[] myProcesses = Process.GetProcesses();
foreach(Process myProcess in myProcesses)
{
if (myProcess.MainWindowTitle.IndexOf(@"u:\teclas.txt") != -1)
{
SwitchToThisWindow(myProcess.MainWindowHandle, true);
break;
}
}
}
}
}
2006-02-22
Mejoras de seguridad en Service Pack 2
2006-02-15
copiar ficheros en plan guay...
Me he hecho una aplicacioncita de consola que va copiando un fichero e imprimiendo el progreso y la verdad es que mola; sería algo así:
class Class1
{
[STAThread]
static void Main(string[] args)
{
FileRoutines.CopyFile(new FileInfo(@"U:\Correo\P5567backup.pst"),
new FileInfo(@"\\vclsfls1\rpos\RPOS103\prueba\P5567.pst"),
CopyFileOptions.Restartable,
new CopyFileCallback(ActualizarProgresoDeCopia)); //este nosotros no lo usaremos, aunque mola!
}
public static CopyFileCallbackAction ActualizarProgresoDeCopia(FileInfo source, FileInfo destination, object state, long totalFileSize, long totalBytesTransferred)
{
Console.WriteLine("Bytes copiados: " + totalBytesTransferred.ToString());
return CopyFileCallbackAction.Continue;
}
}
He comprobado que, efectivamente, si lo cortas a la mitad (paras el programa) y luego simplemente vuelves a intentar la copia, el proceso continúa desde donde lo dejó.
Ahí va la clase "FileRoutines", muy elegantemente implementada...
public sealed class FileRoutines
{
public static void CopyFile(FileInfo source, FileInfo destination)
{
CopyFile(source, destination, CopyFileOptions.None);
}
public static void CopyFile(FileInfo source, FileInfo destination, CopyFileOptions options)
{
CopyFile(source, destination, options, null);
}
public static void CopyFile(FileInfo source, FileInfo destination, CopyFileOptions options, CopyFileCallback callback)
{
CopyFile(source, destination, options, callback, null);
}
public static void CopyFile(FileInfo source, FileInfo destination, CopyFileOptions options, CopyFileCallback callback, object state)
{
if (source == null) throw new ArgumentNullException("source");
if (destination == null)
throw new ArgumentNullException("destination");
if ((options & ~CopyFileOptions.All) != 0)
throw new ArgumentOutOfRangeException("options");
new FileIOPermission(FileIOPermissionAccess.Read, source.FullName).Demand();
new FileIOPermission(FileIOPermissionAccess.Write, destination.FullName).Demand();
CopyProgressRoutine cpr = callback == null ? null : new CopyProgressRoutine(new CopyProgressData(source, destination, callback, state).CallbackHandler);
bool cancel = false;
if (!CopyFileEx(source.FullName, destination.FullName, cpr, IntPtr.Zero, ref cancel, (int)options))
{
throw new IOException(new Win32Exception().Message);
}
}
private class CopyProgressData
{
private FileInfo _source = null;
private FileInfo _destination = null;
private CopyFileCallback _callback = null;
private object _state = null;
public CopyProgressData(FileInfo source, FileInfo destination, CopyFileCallback callback, object state)
{
_source = source;
_destination = destination;
_callback = callback;
_state = state;
}
public int CallbackHandler(
long totalFileSize, long totalBytesTransferred,
long streamSize, long streamBytesTransferred,
int streamNumber, int callbackReason,
IntPtr sourceFile, IntPtr destinationFile, IntPtr data)
{
return (int)_callback(_source, _destination, _state, totalFileSize, totalBytesTransferred);
}
}
private delegate int CopyProgressRoutine(
long totalFileSize, long TotalBytesTransferred, long streamSize,
long streamBytesTransferred, int streamNumber, int callbackReason,
IntPtr sourceFile, IntPtr destinationFile, IntPtr data);
[SuppressUnmanagedCodeSecurity]
[DllImport("Kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)]
private static extern bool CopyFileEx(
string lpExistingFileName, string lpNewFileName,
CopyProgressRoutine lpProgressRoutine,
IntPtr lpData, ref bool pbCancel, int dwCopyFlags);
}
public delegate CopyFileCallbackAction CopyFileCallback(FileInfo source, FileInfo destination, object state, long totalFileSize, long totalBytesTransferred);
public enum CopyFileCallbackAction
{
Continue = 0,
Cancel = 1,
Stop = 2,
Quiet = 3
}
[Flags]
public enum CopyFileOptions
{
None = 0x0,
FailIfDestinationExists = 0x1,
Restartable = 0x2,
AllowDecryptedDestination = 0x8,
All = FailIfDestinationExists Restartable AllowDecryptedDestination
}
}
2006-02-09
Para leer: Novedades de .net
2006-01-19
FREE PDF Reader for Everyday Use
2006-01-18
MSDN .NET Framework Developer Center: The LINQ Project
2005-12-15
Me gusta mi teclado...
Ya hace tiempo que vengo usando slickrun como sustituto de "Inicio - ejecutar..." porque me permite definir mis propios comandos rápidos (por ejemplo, tengo un comando proy que abre directamente el proyecto CGDN+ que se le pase como parámetro).
Hoy he descubierto qliner hotkeys, que es la forma más fácil que he visto nunca de tener combinaciones de teclas asignadas a programas o acciones. Te pinta un teclado en la pantalla al darle durante más de 3 segundos a la tecla "win", y permite asignar accesos directos (outlook, explorer, mis documentos) a combinaciones de la tecla "win". Super guay.
2005-12-12
Tendencias en desarrollo de software
Plataformas y lenguajes:
- Windows y Linux siguen dominando como plataformas
- Unix (open o mainframe) cede terreno ante Linux
- Los lenguajes que crecen en popularidad (Java, C#, VB.net, Python y Ruby) tienen en común que están orientados a objetos y que corren en entornos "gestionados" (máquinas virtuales), con características que los hacen más sencillos (garbage-collection, ausencia de punteros...)
- C y C++ se ven constantementes desplazados por Java y, más recientemente, C#
Métodos y técnicas de desarrollo
- El modelado (de datos y procesos) está encontrando uso en la práctica, más allá del entorno académico al que se restringía hasta hace poco
- Las herramientas y técnicas de prueba también están empezandose a adoptar de forma generalizada, aunque aún queda un largo camino
Tendencias
- Open source está ganando una gran importancia (Eclipse), aunque Microsoft dada su posición dominante no está en absoluto amenazada
- De las tecnologías más recientes, únicamente los web-services han satisfecho las expectativas de adopción por parte de la comunidad de desarrollo
Ajax - ¿qué hay de nuevo?
¿Qué es AJAX? en la wikipedia viene una serie de definiciones y ejemplos; básicamente se trata de cargar partes de una página dinámicamente usando ciertas funciones javascript disponibles desde IE5.5 (XMLHttpRequest). Eso permite a un programador ingenioso hacer aplicaciones web más amigables, ya que simulan funcionar como una aplicación pc clásica (véase gmail, flickr, etc...)
¿Qué tenemos hoy en día para programar con AJAX sin necesitar a un super-experto en programación? pues, aunque aún es software beta; microsoft tiene preparado "Atlas", un conjunto de librerías y utilidades (pensadas, como no, para ASP.NET 2.0) que permiten (en teoría) diseñar una interfaz de usuario a base de drag and drop con toda la potencia del AJAX.
Para el que quiera profundizar...
2005-10-19
SlickUpload: Subir ficheros indicando el progreso
pero realmente no muestra el progreso de subida, sino el progreso del almacenamiento en disco... parece que SlickUpload sí muestra el verdadero progreso.
Seguiremos investigando.
2005-09-26
El misterio de los add-ins de Office, resuelto
Para que Visio sepa qué add-ins hay y demás hay una rama del registro concreta en la que se almacenan simplemente sus nombres, y la forma de carga. Ahí va un ejemplo:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Visio\Addins\VisioAddIn.Connect]
"Description"="Cliente para Visio RPOS"
"FriendlyName"="Cliente Visio RPOS"
"LoadBehavior"=dword:00000003
La clave es el "LoadBehavior", que indica si deshabilitar o no el add-in. En nuestro caso necesitamos un 3.
2005-07-17
Artículo en MSDN: Aislar IU de la capa de negocio
Este UIP App Block me ha recordado enormemente al multicanal. ¿lo sustituye? ¿lo complementa?
2005-07-05
probando flickr
2005-06-15
Métricas interesantes de General Electric
- First Time Right: es el porcentaje de componentes (documentos, módulos, lo que se defina) que se entregan bien a la primera.
- On Time Delivery: porcentaje de componentes entregados en el plazo previsto
- Coste de la calidad: tiempo dedicado a peer reviews y a arreglar errores encontrados en UAT o en Peer Reviews
- SPAN: desviaciones en tiempo
- Tenemos que empezar a pensar en gestionar nuestros proyectos en base a entregables
- La relación con nuestros proveedores debe ser un poco más "seria"
2005-06-02
Ajax.NET - Llamadas a servidor desde cliente ¿bien hechas?
Ajax.NET - The free library for .NET (C#)
Parece ser el truco de obtener cachos de la página con XML pero bien hecho, integradito con el resto de la página asp.net. Si es así, ¡mooola!
2005-05-30
El diseño es el código: Un ensayo de Jack W. Reeves
Vale, ¿y esa idea para qué nos sirve? quizá debamos reflexionar sobre la forma en la que las empresas de software entienden su proceso productivo: unos señores diseñan todo lo que pueden y luego otros programan cuasi-mecánicamente. Si entendemos que programar es, en realidad, parte del diseño, quizá (sólo quizá) esta manera de organizar el trabajo no sea la más lógica ¿no?
2005-05-04
del.icio.us
Lo que mas mola es que es super-super-friki, con páginas que no tienen imágenes y con urls que realmente sirven para usar el sistema.
2005-04-15
Datagrid de Windows Forms
http://www.codeproject.com/cs/miscctrl/DataGridZen.asp
