La aplicación está reálmente muy bien dentro de su temática, con su sistema de scripts integrado y tal, aunque me he fijado en el video que los controles tienen una cantidad ínfima de eventos, algunos controles solo tienen hasta 2 eventos, esto no lo puedo criticar ya que al programa no se le puede pedir más, pues no es un lenguaje de programación orientado a objetos, pero la diferencia se puede apreciar con claridad, es una aplicación muy limitada (aunque quizás sea la mejor dentro de las aplicaciones del mismo tipo).
Por otro lado debo decir que es lo más cutre que he visto, no se en que estaría pensando el autor del video al poner "Curso de sistemas y bases de datos" enseñando como hacer una aplicación de facturación con un programa de ese estilo, a mi me ha resultado patético, muy muy cutre y nada interesante, ya que lo que hagas con ese programa va a estar muy limitado y no vale la pena aprender eso, no te servirá para mucho, no es programación ...aunque cada uno que aprenda lo que le guste.
Mírate este otro video, sería mucho más util para ti que aprendieses así:
Conoces alguno con el que poder hacer algo parecido?
Es que desde un principio lo que planteas me resulta muy extraño xD
¿Te das cuenta que estás intentando desarrollar una aplicación de contabilidad usando un "DVD Menu Builder"?
No digo que no se puede ...vaya, si tiene su propio lenguaje de scripting incorporado entonces podrá sumar, restar, dividir y multiplicar, pero... no se puede comparar, el caso es que sigue siendo una aplicación para crear menues, no programas.
Si lo que quieres es desarrollar una aplicación con su GUI (su interface gráfica, con sus botones, etc) entonces diréctamente te recomiendo que empieces a aprender un lenguaje compilado de los "simples" como VB6, aunque si quieres empezar fuerte pues VB.NET, C#, o Java ...pero si el código del tal AutoPlay MediaStudio te cuesta entenderlo entonces te aseguro que esto otro te costaría muchísimo más.
Perdona si me equivoco pero me da la sensación de que no sabes donde te has metido, no puedes crear una aplicación de contabilidad en un dia y con el típico programa para crear menus, hazlo bien, primero has de aprender y conocer un lenguaje de programación con el que manejarte.
Yo te puedo ayudar a resolver alguna que otra duda, pero no todas las que tienes, ya que yo tampoco he experimentado lo de enviar e interceptar mensajes entre dos ensamblados mios.
Lo primero de todo a lo que voy a hacer referencia es a los tipos de declaraciones que has usado:
Se puede apreciar con claridad que no son para VB.NET, sinó para VB6, no copies todo lo que veas en internet a la ligera, fíjate mejor en las cosas importantes, el tipo "Any" es obsoleto, no existe en VB.NET y te daría un error de compilación (eso demuestra que no los has probado xD), además los Integers también se podrían decir que son obsoletos para esa función en particular ya que si usas un entero en wParam o lParam no te va a funcionar en equipos con arquitectura de 64 Bit.
Así que lo primero de todo, debes especificar corréctamente los datatypes para VB.NET:
Creo saber cómo sacar el handle de una ventana usando FindWindow por eso no pregunté por el parámetro
Código
Dim hWnd1 As Int32 = FindWindow(vbNullString, "Nombre_de_la_ventana")
De nuevo estás usando el tipo incorrecto, el handle no es un Integer, sinó un IntPtr:
Citar
IntPtr: platform-specific type that is used to represent a pointer or a handle.
Hasta donde yo sé si devuelves el valor de tipo Integer (Int32) el handle funciona en los casos en los que he testeado, yo también empecé usando Integer para casi todo xD, pero una insignificancia o un descuido tán pequeño podría repercutir en equipos de 64 Bit como es en el caso de los tipos incorrectos de las funciones PostMessage y SendMessage, y vete a saber los otros posibles problemas técnicos que puede ocasionar por usar un integer en lugar del tipo específico para el valor.
Te aconsejo que para obtener el Handle lo hagas de la siguiente manera (además me parece más sencillo ya que lo busco por el nombre del proceso en lugar de por el nombre de la ventana):
b) ¿Cuál correspondería para el caso de enviar los clic a la otra aplicación?
Para simular el evento MouseClick completo, primero tienes que simular el evento MouseDown y luego el MouseUp, así que estas son las constantes que debes enviar para hacer un click del botón izquierdo del mouse:
d) wParam y lParam: ¿qué son exactamente y de dónde saco estos valores?
El uso exacto de los parámetros wParam y lParam dependen del tipo de mensaje que envies, por ejemplo si quieres simular el evento KeyPress, primero mandas el valor para simular el evento KeyDown (constante WM_KEYDOWN), entonces en wParam debes especificar el KeyCode de la letra que quieres simular (presionar), y como no tenemos ninguna información adicional que enviar entonces el parámetro lParam lo especificas como nulo (IntPtr.Zero) 0.
EDITO: Para el uso de WM_LBUTTONDOWN en el parámetro wParam debes especificar una o una combinación de teclas virtuales para presionar, que en tu caso sería esta constante:
Citar
Código:
MK_LBUTTON 0x0001
The left mouse button is down.
Y como parámetro de lParam debes especificar las coordenadas x.y donde se va a simular el click, así que en teoría me imagino que sería así:
Código
Dim Coordenada_X As IntPtr ="&H"&Hex$(50)
Dim Coordenada_Y As IntPtr ="&H"&Hex$(100)
SendMessage(Handle, &H201, &H1, Coordenada_X Or Coordenada_Y)
Ahora, debemos enviar el mensaje de la constante "WM_LBUTTONUP", donde requerimos un pequeño cambio al especificar el parámetro wParam, debemos pasarlo nulo para indicar que no estamos manteniendo presionado ninguna tecla virtual (para que lo entiendas un caso totálmente contrario podría ser si quesieramos enviar un mensaje de "Shift+LeftButton" y usar distintas coordenadas aquí, de ese modo estaríamos simulando que seleccionamos algunos elementos mientras mantenemos la tecla shift presionada):
Código
SendMessage(Handle, &H202, IntPtr.Zero, Coordenada_X Or Coordenada_Y)
PD: Si no te funcionase con intptr.zero prueba especificando el código hexadecimal de Windows: &H0
En fín, el tema de SendMessage es MUUUUY extenso (y yo no se tanto si es lo que puede parecer), ya has visto la inmensa cantidad de constantes que puse arriba, y cada una de ellas contiene una buena cantidad de posibles valores para wParam y lParam, no esperes conseguir mucha ayuda acerca de este tema, en ningún sitio (te lo digo por experiencia), porque es muy cansado de aprender, de contestar, y de almacenar toda esa información en la memoria, así que yo te aconsejo que te intereses sólamente en la información para el tipo de evento que quieres enviar, no más, porque como ya digo es muy extenso.
Aunque por otro lado todo eso está documentado tanto de forma oficial como no oficial, para serte sincero en el MSDN tienes todo lo que necesitas, desde los valores que debes especificar como lParam y wParam para simular cada tipo de evento, como códigos de ejemplo en C# y VB.NET que postea la gente al final de la página, lo que pasa es que muchos no leen hasta abajo del todo... pero abajo del todo siempre suele estar ese código que nos salva la vida cuando no entendemos del todo como codearlo nosotros mismos xD
Y para cuando te aburras del MSDN, siempre puedes mirar pinvoke.net, es otra página excelente donde encontrarás mucha información acerca de todos los parámetros relacionados con PostMessage y SendMessage y en general toda la ayuda necesaria para todas las funciones de la API de Windows.
PD: Se que no te he aclarado como enviar e interceptar un click a un botón en particular, porque nunca he intentado clickar un botón entre aplicaicón y aplicación y no me quiero equivocar dándote ideas, sincéramente yo solo lo he usado para cosas que no están del todo relacionadas con tu problema, como por ejemplo enviar keystrokes (pulsaciones dle teclado).
Leí bastantes códigos hechos en otros lugares, hasta en la MSDN pero no logro comprenderlos así que de última recurrí aquí. Lo peor es que me van a seguir saliendo dudas sobre esto y no quisiera abusar así que solo les pido un poco de orientación para ver si los puedo hacer yo.
Sería bueno que posteases uno de los códigos que no comprendes, así te ayudamos a que lo comprendas y vas avanzando en el uso de SendMessage.
Básicamente es lo que te ha comentado $Edu$, hacer la comparación inversa de como lo estés haciendo, pero un ListBox no contiene atributos para modificar lo que requieres. Sólamente puedes modificar el color de fondo dibujando manuálmente los items, y si encima quieres extender la funcionalidad para colorear ciertos Items eso requiere un poco más de código.
Yo te recomiendo que te olvides del ListBox y utilices un ListView, ya que se puede asemejar bastante a un ListBox si lo configuras corréctamente, y además puedes modificar el color de los item(s) que quieras sin necesidad de handlear los eventos de dibujo:
Código
Dim Random_Color AsNew Random ' No es necesario, pero lo usaré en este ejemplo para colorear de forma aleatoria.
PrivateSub Test()' Handles MyBase.Load
' Selecciono la vista "Detalles"
ListView1.View= View.Details
' Agrego una columna
ListView1.Columns.Add("Items:")
' Agrego unos cuantos items
ListView1.Items.AddRange("A B C D E F".Split().Select(Function(x)New ListViewItem(x)).ToArray)
Una forma de conseguir la carpeta del perfil de un usuario específico es mediante el registro de Windows, ya que se almacenan ahí, pero desconozco si la ruta de dicha clave es la misma en Windows XP, el siguiente código lo he hecho bajo Windows 8 y funciona en Windows 7 también.
Código
PublicClass Form1
PrivateSub Test(sender AsObject, e As EventArgs)HandlesMyBase.Shown
Dim SID AsString="S-1-5-21-3344876933-2114507426-1248549232-500"
Dim UserName AsString= SID_To_UserName(SID)
Dim ProfilePath As IO.DirectoryInfo=New IO.DirectoryInfo(SID_To_ProfilePath(SID))
Dim LastAccess As DateTime = ProfilePath.LastAccessTime
es necesario ejecutar esta funcion al proyecto constantemente
Solamente para intentar corregir errores específicos y para limpiar archivos temporales por ejemplo si referencias una dll y luego ya no la quieres, para no limpiar los archivos manuálmente.
Y si uno actualiza a versiones superiores los productos del VS no ocasiona errores a futuros
Es imposible contestar algo seguro a esa pregunta, pueden haber mil signos de futuras incompatibilidades entre los productos de Microsoft en un PC en particular y bajo una versión de Windows o una versión del FW en particular.
Haz una instalación limpia para disminuir lo mámixo posible la posibilidad de errores, primero desinstalas todo lo referente a tu VS2008 express, reinicias el PC porque se harán cambios muy internos, y luego instalas la versión reciente del producto.
sharpdevelop version 4.0 con este ide tambien puedo hacer proyectos a gran escala
Bueno eso depende de tus necesidades, la IDE es conocida porque utiliza pocos recursos, ¿pero es conocida por algo más? ...yo diría que no.
Imagino que tendrá básicamente el mismo nivel de productividad que la IDE de Microsoft, es decir en teoría podrás hacer CASI lo mismo, depende de para lo que lo necesites, le faltan bastantes cosas y no tiene soporte para desarrollar para algunas plataformas.
Si quieres mi opinión (no profesional) yo probé la IDE hace tiempo y no me gustó nada, todo eran pegas desde un principio, desde intentar agregar controles de terceros al Toolbox o activar el IntelliSense (si, activar, porque había que activarlo de forma manual!), además no tiene un selector de temas visuales (o al menos no tenía cuando lo probé) y a mi no me gusta trabajar en un ambiente tan blanco, esa IDE hace que mi rendimiento disminuya por completo ya que se me cansan los ojos con tanto blanco, así que no le dí ni 5 minutos de prueba y a la basura se fue.
Por no hablar de que los posibles errores que tenga un proyecto en una IDE opensource jamás van a tener soluciones en Google o al menos no soluciones tán documentadas como los de una compañia como es Microsoft.
En resumen, yo SharpDevelop ni lo usaría porque tengo una buena máquina y prefiero mayor calidad de características a menor consumo de RAM, pero en caso de usarlo solo lo usaría para proyectos puntuales que requieran bien poco.
Aquí tienes una tabla con casi todas las diferencias: