Gracias por las respuestas anteriores que me permitieron completar la herramienta básica que muestra una gran cruz roja en las coordenadas del mouse para que sea más visible. La cruz roja es una imagen con fondo transparente en forma transparente. El problema es que no puede hacer clic, ya que su parte superior y el centro de la forma están realmente posicionados con el mouse xy. ¿Hay alguna manera de hacer que esto se pueda utilizar para que la cruz aún se muestre en el cursor pero se pueda "hacer clic"?¿Forma superior, haciendo clic en "a través" posible?
Respuesta
Puede utilizar SetWindowLong para establecer el estilo de ventana WS_EX_TRANSPARENT:
Si la ventana de capas tiene el estilo de ventana WS_EX_TRANSPARENT extendida, la forma de la ventana por capas tendrá en cuenta y los eventos de ratón se pasará a la otras ventanas debajo de la ventana en capas.
CodeProject tiene this artículo que detalla la técnica. Aunque está en VB.NET, debería ser fácil convertirlo a C#.
He utilizado el siguiente código en el pasado:
public enum GWL
{
ExStyle = -20
}
public enum WS_EX
{
Transparent = 0x20,
Layered = 0x80000
}
public enum LWA
{
ColorKey = 0x1,
Alpha = 0x2
}
[DllImport("user32.dll", EntryPoint = "GetWindowLong")]
public static extern int GetWindowLong(IntPtr hWnd, GWL nIndex);
[DllImport("user32.dll", EntryPoint = "SetWindowLong")]
public static extern int SetWindowLong(IntPtr hWnd, GWL nIndex, int dwNewLong);
[DllImport("user32.dll", EntryPoint = "SetLayeredWindowAttributes")]
public static extern bool SetLayeredWindowAttributes(IntPtr hWnd, int crKey, byte alpha, LWA dwFlags);
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
int wl = GetWindowLong(this.Handle, GWL.ExStyle);
wl = wl | 0x80000 | 0x20;
SetWindowLong(this.Handle, GWL.ExStyle, wl);
SetLayeredWindowAttributes(this.Handle, 0, 128, LWA.Alpha);
}
pero también fue copiado de otro lugar. Las líneas importantes aquí están en el método OnShown
. Aunque tengo que admitir que la línea
wl = wl | 0x80000 | 0x20;
es un poco críptico, estableciendo el WS_EX_LAYERED y estilos WS_EX_TRANSPARENT extendida.
Puede probablemente también configurarlo como
wl = wl | WS_EX.Layered | WS_EX.Transparent;
Para proporcionar una versión más detallada/comentado, que también utiliza TransparencyKey como clave de la transparencia (no negro como la versión anterior), y uno puede establecer _alpha según se desee .
/// <summary>
/// 0: the window is completely transparent ... 255: the window is opaque
/// </summary>
private byte _alpha;
private enum GetWindowLong
{
/// <summary>
/// Sets a new extended window style.
/// </summary>
GWL_EXSTYLE = -20
}
private enum ExtendedWindowStyles
{
/// <summary>
/// Transparent window.
/// </summary>
WS_EX_TRANSPARENT = 0x20,
/// <summary>
/// Layered window. http://msdn.microsoft.com/en-us/library/windows/desktop/ms632599%28v=vs.85%29.aspx#layered
/// </summary>
WS_EX_LAYERED = 0x80000
}
private enum LayeredWindowAttributes
{
/// <summary>
/// Use bAlpha to determine the opacity of the layered window.
/// </summary>
LWA_COLORKEY = 0x1,
/// <summary>
/// Use crKey as the transparency color.
/// </summary>
LWA_ALPHA = 0x2
}
[DllImport("user32.dll", EntryPoint = "GetWindowLong")]
private static extern int User32_GetWindowLong(IntPtr hWnd, GetWindowLong nIndex);
[DllImport("user32.dll", EntryPoint = "SetWindowLong")]
private static extern int User32_SetWindowLong(IntPtr hWnd, GetWindowLong nIndex, int dwNewLong);
[DllImport("user32.dll", EntryPoint = "SetLayeredWindowAttributes")]
private static extern bool User32_SetLayeredWindowAttributes(IntPtr hWnd, int crKey, byte bAlpha, LayeredWindowAttributes dwFlags);
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
//Click through
int wl = User32_GetWindowLong(this.Handle, GetWindowLong.GWL_EXSTYLE);
User32_SetWindowLong(this.Handle, GetWindowLong.GWL_EXSTYLE, wl | (int)ExtendedWindowStyles.WS_EX_LAYERED | (int)ExtendedWindowStyles.WS_EX_TRANSPARENT);
//Change alpha
User32_SetLayeredWindowAttributes(this.Handle, (TransparencyKey.B << 16) + (TransparencyKey.G << 8) + TransparencyKey.R, _alpha, LayeredWindowAttributes.LWA_COLORKEY | LayeredWindowAttributes.LWA_ALPHA);
}
- 1. Haciendo clic a través de .png transparente
- 2. Cerrar la aplicación Mac (haciendo clic en la cruz roja arriba) y volver a abrir haciendo clic en el icono
- 3. Haciendo clic en el token en NSTokenField
- 4. haciendo un blog a través de php
- 5. Haciendo clic en el botón cancelar showInputDialogue
- 6. ¿Qué es "esto" en JavaScript haciendo clic?
- 7. Haciendo clic en el mouse enviando mensajes
- 8. Cómo limpiar el JTextField haciendo clic JButton
- 9. ¿Es posible anular la selección en un QTreeView haciendo clic en un elemento?
- 10. ¿Cómo hacer mapas de área de imagen posicionados de forma absoluta haciendo clic con el mouse?
- 11. Haciendo un paquete virtual disponible a través de sys.modules
- 12. Haciendo un control "transparente" para hacer clic en eventos
- 13. Cómo confirmar haciendo clic en un enlace usando jQuery
- 14. lienzo html5 haciendo clic en Bezier detección de forma de camino
- 15. Mover la ventana sin decorar haciendo clic en JPanel
- 16. OpenLayers: deshabilita el zoom haciendo doble clic en
- 17. ¿Cómo aceptar una llamada entrante haciendo clic en un botón?
- 18. ¿Haciendo clic en una imagen pero todavía responde al mouseover?
- 19. Llamar a un método haciendo clic en un botón en un UIWebView
- 20. Ruby Watir: ¿haciendo clic en Aceptar en Alertas de JavaScript?
- 21. ¿Es posible iterar a través de JSONArray?
- 22. jQuery arregle la orden li haciendo clic en un enlace
- 23. haciendo referencia a System.Windows.Automation
- 24. Capturando una variable de PHP haciendo doble clic en Notepad ++
- 25. Haga clic a través de div con un canal alfa
- 26. Java Abrir una nueva ventana haciendo clic en un botón
- 27. haciendo una vista de texto hacer clic en Android
- 28. Haciendo un JButton se puede hacer clic en un JTable
- 29. Cambiar src marco flotante haciendo clic en un enlace
- 30. Cómo abrir un archivo haciendo clic en el hipervínculo
¿Podría proporcionarme un poco más detalles? No tengo experiencia en esta API de bajo nivel, ¡gracias! – Petr
Muchas gracias, este es un lugar realmente increíble, tales respuestas rápidas. – Petr
Con SetLayeredWindowAttributes, la transparencia, establecida anteriormente en VS Designer, se pierde y el formulario es semitransparente. ¡Pero deshabilitar esta línea no afecta los efectos de "clic", funciona muy bien! – Petr