¿Hay alguna manera de eliminar el borde/marco (el bit Aero) de la ventana de otra aplicación (digamos bloc de notas) desde un programa VB.NET?Eliminar el marco/ventana/borde de otro programa (el bit Aero) usando VB.NET
Respuesta
Puede hacerlo utilizando P-Invoke. A continuación se muestra un código que utiliza SetWindowLong (en User32.dll) para cambiar el borde de la ventana principal del bloc de notas. (Este código supone que tiene una instancia de bloc de notas en ejecución.) Puede experimentar con diferentes estilos de ventana para lograr el resultado que desea.
GWL_STYLE es para estilos de ventana básicos. Puede leer sobre ellos here.
GWL_EXSTYLE es para estilos de ventana ampliados. Puede leer sobre ellos here.
Imports System.Diagnostics
Imports System.Runtime.InteropServices
Module Module1
Sub Main()
Dim notepad As Process = Process.GetProcessesByName("notepad")(0)
Dim GWL_STYLE As Int32 = -16
Dim GWL_EXSTYLE As Int32 = -20
' MainWindowHandle happens to be the handle of the window you want for notepad.
' It may not be the handle you want if you try this on a different process.
Dim hWnd As IntPtr = notepad.MainWindowHandle
' You can examine the current styles using GetWindowLong.
Dim styles As WindowStyles = GetWindowLong(hWnd, GWL_STYLE)
Dim exStyles As WindowStyles = GetWindowLong(hWnd, GWL_EXSTYLE)
' WS_VISIBLE must be used for the window to be selectable.
Dim newStyles As WindowStyles = WindowStyles.WS_VISIBLE Or WindowStyles.WS_BORDER
SetWindowLong(hWnd, GWL_STYLE, newStyles)
' If you want to modify the extended styles, use GWL_EXSTYLE
SetWindowLong(hWnd, GWL_EXSTYLE, exStyles)
End Sub
_
Private Function GetWindowLong(_
ByVal hWnd As IntPtr, _
ByVal nIndex As Integer) As Integer
End Function
_
Private Function SetWindowLong(_
ByVal hWnd As IntPtr, _
ByVal nIndex As Integer, _
ByVal dwNewLong As IntPtr) As Integer
End Function
End Module
_
Public Enum WindowStyles As Long
WS_OVERLAPPED = 0
WS_POPUP = 2147483648
WS_CHILD = 1073741824
WS_MINIMIZE = 536870912
WS_VISIBLE = 268435456
WS_DISABLED = 134217728
WS_CLIPSIBLINGS = 67108864
WS_CLIPCHILDREN = 33554432
WS_MAXIMIZE = 16777216
WS_BORDER = 8388608
WS_DLGFRAME = 4194304
WS_VSCROLL = 2097152
WS_HSCROLL = 1048576
WS_SYSMENU = 524288
WS_THICKFRAME = 262144
WS_GROUP = 131072
WS_TABSTOP = 65536
WS_MINIMIZEBOX = 131072
WS_MAXIMIZEBOX = 65536
WS_CAPTION = WS_BORDER Or WS_DLGFRAME
WS_TILED = WS_OVERLAPPED
WS_ICONIC = WS_MINIMIZE
WS_SIZEBOX = WS_THICKFRAME
WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW
WS_OVERLAPPEDWINDOW = WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or _
WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
WS_POPUPWINDOW = WS_POPUP Or WS_BORDER Or WS_SYSMENU
WS_CHILDWINDOW = WS_CHILD
WS_EX_DLGMODALFRAME = 1
WS_EX_NOPARENTNOTIFY = 4
WS_EX_TOPMOST = 8
WS_EX_ACCEPTFILES = 16
WS_EX_TRANSPARENT = 32
'#If (WINVER >= 400) Then
WS_EX_MDICHILD = 64
WS_EX_TOOLWINDOW = 128
WS_EX_WINDOWEDGE = 256
WS_EX_CLIENTEDGE = 512
WS_EX_CONTEXTHELP = 1024
WS_EX_RIGHT = 4096
WS_EX_LEFT = 0
WS_EX_RTLREADING = 8192
WS_EX_LTRREADING = 0
WS_EX_LEFTSCROLLBAR = 16384
WS_EX_RIGHTSCROLLBAR = 0
WS_EX_CONTROLPARENT = 65536
WS_EX_STATICEDGE = 131072
WS_EX_APPWINDOW = 262144
WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE Or WS_EX_CLIENTEDGE
WS_EX_PALETTEWINDOW = WS_EX_WINDOWEDGE Or WS_EX_TOOLWINDOW Or WS_EX_TOPMOST
'#End If
'#If (WIN32WINNT >= 500) Then
WS_EX_LAYERED = 524288
'#End If
'#If (WINVER >= 500) Then
WS_EX_NOINHERITLAYOUT = 1048576 ' Disable inheritence of mirroring by children
WS_EX_LAYOUTRTL = 4194304 ' Right to left mirroring
'#End If
'#If (WIN32WINNT >= 500) Then
WS_EX_COMPOSITED = 33554432
WS_EX_NOACTIVATE = 67108864
'#End If
End Enum
Explicación del código
no estoy seguro de la cantidad de experiencia que tiene en el desarrollo de aplicaciones GUI, así que voy a dar un poco de historia sobre cómo funciona una ventana. Una ventana tiene un número de identificación único llamado asa. También se asocia con la ventana un procedimiento de ventana, que maneja mensajes (números enteros que identifican eventos y comandos) para esa ventana. Cuando se crea una ventana, usted especifica qué estilos desea que tenga la ventana, etc. Hay mucha más complejidad para las aplicaciones de Windows, pero para evitar empantanarnos en los detalles, avanzaremos.
Afortunadamente, .NET Winforms nos aísla de tener que interactuar con la API de Windows y manejar mensajes directamente (en su mayor parte) y hace que sea muy fácil crear aplicaciones funcionales de GUI. Hay mucho más poder bajo el capó en la API de Windows que la mayoría de los desarrolladores de .NET no suelen tener que preocuparse.
Ahora con ese fondo, el código debería ser un poco más fácil de entender.
Primero debemos obtener el primer proceso llamado "bloc de notas".
Dim notepad As Process = Process.GetProcessesByName("notepad")(0)
A continuación, se definen dos números enteros GWL_STYLE
y GWL_EXSTYLE
. Estos dos enteros tendrán un significado específico en el contexto de la función SetWindowLong
. Su valor (y el valor de muchas otras constantes) se puede encontrar en Winuser.h y el resto de los archivos de encabezado en el SDK de Windows.
Dim GWL_STYLE As Int32 = -16
Dim GWL_EXSTYLE As Int32 = -20
A continuación aparece el asa de la ventana principal de la libreta.
Dim hWnd As IntPtr = notepad.MainWindowHandle
Después de eso encontramos la función GetWindowLong. De MSDN:
La función GetWindowLong recupera información sobre la ventana especificada.
GetWindowLong
toma el identificador de ventana y un valor que indica qué información recuperar y devuelve la información especificada.
Dim styles As WindowStyles = GetWindowLong(hWnd, GWL_STYLE)
Dim exStyles As WindowStyles = GetWindowLong(hWnd, GWL_EXSTYLE)
Estos fueron incluidos por lo que podría ver qué estilos se aplica a la ventana, por lo que podría determinar qué estilos dejar fuera.
A continuación definimos los estilos que queremos aplicar a la ventana. Puede leer sobre los diversos estilos y sus significados here.
Dim newStyles As WindowStyles = WindowStyles.WS_VISIBLE Or WindowStyles.WS_BORDER
A continuación, aplicamos los estilos de la ventana usando SetWindowLong. De MSDN:
La función SetWindowLong cambia un atributo de la ventana especificada.
SetWindowLong
toma el identificador de ventana, un valor que indica qué atributo cambiar, y el nuevo valor del atributo, y cambia el atributo.
SetWindowLong(hWnd, GWL_STYLE, newStyles)
Eso es básicamente lo que hace el código. Para evitar la repetición, no pasaré a GWL_EXSTYLE
ya que se usa exactamente de la misma manera que GWL_STYLE
. El resto del código es solo logística para permitirnos usar SetWindowLong
y GetWindowLong
.
ok No tengo idea de lo que significa el código así que si pudiera ir línea por línea, pero funciona, así que lo acepté como respuesta –
@Jonathan: Acabo de editar y explicar el código. –
¡Muchas gracias! Una cosa que no entiendo es por qué NewStyle está configurado en WS_Visible * OR * WS_Border? ¿Por qué es O? –
- 1. AND bit a bit/NO de VB.NET a C#
- 2. R pasando el marco de datos a otro programa usando el sistema()
- 3. ¿Cómo cambia Windows el color Aero Glass?
- 4. ¿Cómo cambiar a bit en VB.NET?
- 5. Eliminar el último carácter de una cadena (VB.NET 2008)
- 6. ¿Cómo se ejecuta otro .exe de VB.NET como otro usuario?
- 7. El archivo de configuración ha sido cambiado por otro programa
- 8. Operaciones bit a bit en el corto
- 9. Un programa que crea otro programa
- 10. ¿Emula el cambio de bit variable usando solo cambios constantes?
- 11. El programa no se puede cargar después de configurar el bit setuid en
- 12. Usando Boost.Program_options en el programa modular
- 13. Redirigir stdin en el programa C a otro proceso
- 14. Experiencias usando moq con VB.Net
- 15. Verificando si el número es par mirando el último bit - ¿hay algún otro "truco" como este?
- 16. Installshield, desinstalando el programa sin eliminar todas las carpetas
- 17. Ejecutar otro programa en C++
- 18. Encuentra el número Par/Impar sin usar el operador matemático/bit a bit
- 19. ¿Cambiar el color del cristal Aero para mi ventana?
- 20. Usando el archivo mat en el programa C++
- 21. OR bit a bit (|) en el argumento de la función
- 22. Eliminar espacios de una cadena en VB.NET
- 23. Difuminando el fondo de una forma semitransparente (como Aero glass)
- 24. Manipulación de "bit adhesivo" dentro de un programa C
- 25. cómo compilar y ejecutar el programa java en otro programa java?
- 26. Ejecutar programa python desde otro programa python (con ciertos requisitos)
- 27. Eliminar procesos zombie usando el paquete paralelo
- 28. Eliminar el historial del navegador usando jQuery
- 29. ¿Cómo eliminar el último carácter usando sed?
- 30. ¿Eliminar el html adjunto usando jQuery?
¿Quiere decir que quiere cambiar el tipo de borde o eliminar el borde por completo? –