hi leute,
ich möchte ein Label in einem beliebigen Fenster erzeugen. Das könnte z.B. der Desktop oder der Arbeitsplatz sein.
Im Form.Designer wird das so gemacht:
Label lab = new Label();
this.Controls.Add(lab);
Folgendes hab ich probiert:
Control con = new Control();
Label lab = new Label();
lab.AutoSize = true;
lab.BackColor = System.Drawing.Color.White;
lab.Location = new System.Drawing.Point(200, 200);
lab.Name = "lab";
lab.Size = new System.Drawing.Size(35, 13);
lab.Text = "es funktioniert!!!";
lab.Visible = true;
IntPtr wnd; //das desktopfenster
wnd = FindWindow("Progman", "Program Manager");
wnd = FindWindowEx(wnd, 0, "SHELLDLL_DefView", null);
wnd = FindWindowEx(wnd, 0, "SysListView32", "FolderView");
con.FromHandle(wnd);
con.Controls.Add(lab);
das ganze hat aber nicht funktioniert. ich hoffe jemand kann mir weiterhelfen.
du kannst nciht einfach in einen x-beliebiges fenster auf diese art und weine ein label einfügen.
und beachte bitte
Wichtig: [Hinweis] Wie poste ich richtig?
Punkt 5 Problem genau beschreiben, inkl. genauer Fehlermeldung
hat nciht funktiolniert? was genau? fehlermeldung?
beim compiliren gabs einen fehler:
con.FromHandle(wnd);
Fehler 2 Auf den statischen Member "System.Windows.Forms.Control.FromHandle(System.IntPtr)" kann nicht mit einem Instanzenverweis zugegriffen werden. Qualifizieren Sie ihn stattdessen mit einem Typnamen.
mir geht es doch nicht um den quellcode den ich hingeschrieben hab. ich möchte einfach nur wissen wie man ein label in einem anderen fenster darstellt.
Hi!
Ich hab mal in VB ein Label auf den Desktop (HWnd=0) gepackt. Ob man das auch auf andere Fenster machen kann, habich nie ausprobiert:
Imports System.ComponentModel
'Imports Junkroom
''' <summary>Ein Topmost-Label, an keinen Container gebunden</summary>
Public Class ControlCaptionBase : Inherits Label
Implements ISupportInitialize
#Region "Vars"
Private _MeasureGraphics As Graphics
Protected _CaptionedControl As Control
Private _LocationRel As Point
#Region "Vars.API"
Protected Declare Function SetParent Lib "user32" ( _
ByVal hWndChild As IntPtr, _
ByVal hWndNewParent As IntPtr) As Integer
Private Const WS_EX_TOOLWINDOW As Integer = &H80
Private Const WS_EX_NOACTIVATE As Integer = &H8000000
Private Const WS_EX_TOPMOST As Integer = &H8
Private Const WM_NCHITTEST As Integer = &H84
Private Const HTTRANSPARENT As System.Int32 = (-1)
#End Region 'Vars.API
#End Region 'Vars
#Region "Initialisation"
Public Sub New()
MyBase.New()
InitializeComponent()
End Sub
Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
'wird noch vor InitializeComponent() aufgerufen
Get
'Anzeige Topmost einstellen (und nochwas, wassich nich kapiert hab (Code is geklaut))
CreateParams = MyBase.CreateParams
If MyDesignMode.True Then Exit Property
CreateParams.ExStyle = CreateParams.ExStyle _
Or WS_EX_NOACTIVATE Or WS_EX_TOOLWINDOW Or WS_EX_TOPMOST
End Get
End Property
''' <remarks>generated Code</remarks>
Private Sub InitializeComponent()
Me.SuspendLayout()
'
'ControlCaption
'
Me.BackColor = System.Drawing.SystemColors.Info
Me.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.Size = New System.Drawing.Size(100, 23)
Me.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
Me.ResumeLayout(False)
End Sub
Public Sub BeginInit() Implements System.ComponentModel.ISupportInitialize.BeginInit
End Sub
Public Overridable Sub EndInit() Implements System.ComponentModel.ISupportInitialize.EndInit
If MyDesignMode.True() Then Return
If Me.Parent IsNot Nothing Then Me.Parent.Controls.Remove(Me)
SetParent(MyBase.Handle, IntPtr.Zero) 'Mein 'API-Parent' sei der Desktop
'! (Desktop.Handle=IntPtr.Zero). Dadurch werde ich über allen Controls gezeichnet, die auch
'! noch in Me.Parent enthalten sein mögen.
AssignDisposable(_MeasureGraphics, Me.CreateGraphics)
End Sub
#End Region 'Initialisation
#Region "PublicMember"
''' <summary> CaptionedControl mit Beschriftung versehen. Wenn Text="", mich hiden.</summary>
''' <returns>True: Label wurde angezeigt</returns>
Public Overridable Function SetCaption( _
ByVal CaptionedControl As Control, ByVal Text As String) As Boolean
SetCaption = Text <> ""
If SetCaption Then
Me.Text = Text
_LocationRel = New Point(0, -(MyBase.Height + MyBase.Margin.Bottom))
_CaptionedControl = CaptionedControl
SetLocation()
End If
Me.Visible = SetCaption
End Function
#End Region 'PublicMember
#Region "Overrides"
Public Overrides Property Text() As String
Get
Return MyBase.Text
End Get
Set(ByVal value As String)
MyBase.Text = value
If _MeasureGraphics IsNot Nothing Then
'Das orig. AutoSizing funzt ohne Parent-Control (also zur Laufzeit) nicht.
Dim TextWidth As Integer = TextRenderer.MeasureText( _
_MeasureGraphics, _
DirectCast(Me, Label).Text, _
Me.Font, _
New Size(Short.MaxValue, Short.MaxValue), _
TextFormatFlags.LeftAndRightPadding).Width
With Me.Padding
MyBase.Size = New Size(TextWidth + .Left + .Right, MyBase.Height)
End With
End If
End Set
End Property
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If _MeasureGraphics IsNot Nothing Then _MeasureGraphics.Dispose()
MyBase.Dispose(disposing)
End Sub
#End Region 'Overrides
#Region "Helpers"
Protected Sub SetLocation()
Dim Pt As Point = _CaptionedControl.PointToScreen(Point.Empty)
Pt.Offset(_LocationRel)
Me.Location = Pt
End Sub
#End Region 'Helpers
End Class 'ControlCaption
Wesentlich ist wohl die SetParent-API, und der Window-ExStyle.
Das Label darf keiner .Net-ControlCollection angehören.
Der frühe Apfel fängt den Wurm.