Laden...

Steuerelemente in fremden Fenstern anzeigen

Erstellt von progi123 vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.137 Views
progi123 Themenstarter:in
71 Beiträge seit 2008
vor 15 Jahren
Steuerelemente in fremden Fenstern anzeigen

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.

Gelöschter Account
vor 15 Jahren

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?

progi123 Themenstarter:in
71 Beiträge seit 2008
vor 15 Jahren

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.

progi123 Themenstarter:in
71 Beiträge seit 2008
vor 15 Jahren

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.

5.299 Beiträge seit 2008
vor 15 Jahren

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.