Laden...

Forenbeiträge von Hunv Ingesamt 193 Beiträge

14.06.2015 - 16:01 Uhr

Hast du eine Referenz dafür? Ich finde leider nichts in die Richtung auf den Microsoft-Seiten oder wir meinen nicht das Gleiche.

Damit wir uns nicht missverstehen: Meine App läuft nicht oder nur "pausiert" im Hintergrund, wenn ein Push-Update eintrifft. Wäre ja auch zwecklos, wenn meine App laufen müsste um einen ungesehen-counter auf der Startseite hoch zu setzen.

13.06.2015 - 21:19 Uhr

Hallo zusammen,

ich versuche gerade ein Live Tile zu erstellen, welches mir die Anzahl von ungelesenen Benachrichtigungen anzeigt. Da dies nicht durch die App beim Ausführen dieser gesteuert werden kann, muss ich dafür auf die Windows Push Notification Services (WNS) zurückgreifen.
Das Pushen an sich ist kein Problem. Das bekommen ich für Toast-Nachrichten bereits hin. Mein Problem ist nun, wie ich einen Counter auf dem Endgerät um 1 durch eine Push-Nachricht erhöhen kann.
Ich kann absolute Werte (=Texte) ohne Probleme in das Live-Tile machen, aber ich habe bisher keine Möglichkeit gefunden relative Werte zu senden (z.B. "erhöhe um 1").
Das was ich machen möchte ist im Prinzip vergleichbar mit der Anzahl an ungelesenen E-Mails in einem Live Tile. Da wissen Microsofts Server ja auch nicht, wie viele das nun wirklich sind (hoffe ich zumindest, wenn man seine Mails nicht dort hat). Trotzdem wird das Live Tile um 1 erhöht ohne dass ich die E-Mail-App geöffnet habe.

30.10.2014 - 12:07 Uhr

Hi ujr,

ich habe einmal eine minimale Anwendung erstellt.
Dabei ist mir zu meiner Verwunderung aufgefallen, dass das Problem nur aufzutreten scheint, wenn ich das Control via Binding in das Dock einbette.
Wenn ich das Control direct in die Form oder direkt in das Dock via XAML lege, wird Loaded aufgerufen.

Ich habe das Minimalprojekt einmal angehängt.

29.10.2014 - 18:27 Uhr

Nachdem ich nun einen ziemlich frustrierenden Tag damit verbracht habe dem Problem auf die Spur zu kommen habe ich folgendes festgestellt:

Wenn ich in dem Constructor von TabBase und/oder TabHuman das Event abonniere und in der Methode dazu eine Exception schmeiße, wird diese Exception im Designer angezeigt.


        public TabBase()
        {
            this.Loaded += TabBase_Loaded;
        }

        void TabBase_Loaded(object sender, System.Windows.RoutedEventArgs e)
        {
            throw new NotImplementedException("TabBase_Loaded");
        }

Wenn ich das Projekt compiliere und starte gibt es aber keine Exception. Auch im Output-Fenster steht nichts. Wende ich das gleiche ausschließlich auf das TabHumanEuropean an, passiert nichts. Der Designer zeigt keinen Fehler mehr an, compilieren und starten geht.
Mir will einfach nicht in den Kopf, warum das Loaded-Event nicht aufgerufen wird.

Des Weiteren Funktionieren im TabHumanEuropean scheinbar alle anderen Events, nur das Loaded-Event nicht.
Wie bereits geschrieben, funktioniert das Initialized Event. Auch das Loaded-Event des eingebetteten Grids wird aufgerufen. Nur eben nicht das Loaded-Event des Controls selbst.
Auch ein "manuell" definiertes Event im Constructor wird nicht aufgerufen:

        public TabHumanEuropean()
        {
            InitializeComponent();
            
            this.Loaded += TabHumanEuropean_Loaded;
        }

        void TabHumanEuropean_Loaded(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Loaded by Constructor-Loaded");
        }
29.10.2014 - 13:13 Uhr

Ein ViewModel ist kein Steuerelement, und erbt daher auch nicht von UserControl.

Ja, da hast du Recht. Das ganze ist etwas gewachsen und nicht final. Primär geht es mir um das Problem und nicht um die Struktur.

Du hast keine Ereignisse definiert

Das Loaded-Event wird doch von UserControl mitvererbt? Beim "ViewModelTabHuman" klappt das ganze ja auch.

Deine Methoden sind als private deklariert und daher von außen nicht zugreifbar

Ja, das ist richtig. Da das Control es selbst aufruft, funktioniert es aber. Bitte die Namensgebung ignorieren. Es ist definitiv kein ViewModel - anders als es benannt ist. Das muss ich noch korrigieren, wenn ich das grundsätzliche Problem gelöst habe.

Edit:
Ich habe im Ursprungs-Post einmal den Begriff "ViewModel" entfernt um Verwirrungen zu vermeiden und den Fokus auf das Problem und nicht das drum herum zu lenken.

29.10.2014 - 11:45 Uhr

Hi,

ich habe ein Problem.
Ich habe ein UserControl, dass von einem UserControl erbt, das von einem UserControl erbt, das von UserControl und INotifiyPropertyChanged erbt.

Der Reihe nach: Hier einmal die Basis, die von UserControl und INotifyPropertyChanged erbt:

namespace myapp
{
public class TabBase : UserControl, INotifyPropertyChanged
    {
        public TabBase()
        {
        }

        private string _Title = "Unnamed";
        public string Title
        {
            get { return _Title; }
            set
            {
                if (_Title == value) return;

                _Title = value;
                RaisePropertyChanged("Title");
            }
        }

        #region PropertyChanged
        protected virtual void RaisePropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        public event PropertyChangedEventHandler PropertyChanged;
        #endregion
    }
}

Hier die Klasse, die davon erbt:

namespace myapp
{
    public class TabHuman : TabBase
    {
        public string Firstname { get; set; }
        public string Lastname { get; set; }
    }
}

Und hier das UserControl, welches das "Endprodukt" darstellt:

namespace myapp.Tabs.TabHumanEuropean
{
    public partial class TabHumanEuropean
    {
        public TabHumanEuropean()
        {
            InitializeComponent();
        }

        private void TabHuman_Loaded(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Loaded");
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(this.IsLoaded.ToString());
        }

    }
}

und der XAML-Code:

<tabs:TabHuman x:Class="myapp..Tabs.TabHumanEuropean.TabHumanEuropean"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:="clr-namespace:myapp.tabs"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
             Loaded="TabHuman_Loaded"
             DataContext="{Binding RelativeSource={RelativeSource Self}}"
            >
    <Grid Background="Red">
        <Button Content="Show" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
    </Grid>
</tabs:TabHuman>

Im letzten der drei Klassen wird nun aber das "Loaded"-Event nicht ausgelöst und die Eigenschaft "IsLoaded" bleibt auf false. Im Gegensatz dazu wird das Initialized-Event (nicht im Code) aber aufgerufen.
Wenn ich jetzt nicht von TabHuman erben lasse, sondern von TabBase funktioniert das Loaded-Event.
Ich kann mir das nicht so richtig erklären. Kann mir hier jemand weiterhelfen? Was habe ich für Möglichkeiten das Problem zu lösen?

21.09.2014 - 11:00 Uhr

Hi Coffeebean,

vielen Dank für deine Antwort. Das hat mir sehr weitergeholfen!
Ob ich wirklich für jeden Click eine eigene Klasse mache oder ob ich das in der Praxis dann ggf. doch anders mache, wird sich zeigen. Erstmal aber möchte ich es mit eigenen Klassen machen um zu wissen wie es dann in der Theorie und Praxis mal alles funktionieren würde.

20.09.2014 - 17:57 Uhr

Hi,

ich möchte gerne ein Programm schreiben, welches MVVM-conform ist. Dazu gehört auch, soviel ich bisher verstanden habe, nicht die "klassischen" z.B. Button_Click-Events eines Controls zu benutzen, sondern dies über CommandBindings umzusetzen.
Dazu habe ich bisher folgendes gemacht:

XAML:

<RibbonWindow 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MvvmTest.GUI_v2.ViewModels"
        xmlns:cmds="clr-namespace:MvvmTest.GUI_v2.ViewModels.Commands"
        x:Class="MvvmTest.GUI.MainWindow"
        Title="MvvmTest"      
        Height="600"
        Width="800"
        WindowState="Normal"
        WindowStartupLocation="CenterScreen"    
        >
    <RibbonWindow.DataContext>
        <local:ViewModelMain />
    </RibbonWindow.DataContext>

    <RibbonWindow.CommandBindings>
	<!-- Geht nicht -->
        <CommandBinding Command="cmds:Login.CmdLogin" CanExecute="Login_CanExecute" Executed="Login_Executed" />
	<!-- Geht auch nicht -->
        <CommandBinding Command="cmds:Login.CmdLogin" CanExecute="cmds:Login.Login_CanExecute" Executed="cmds:Login.Login_Executed" />    
</RibbonWindow.CommandBindings>

    <Grid>
        <Button Content="Login" Command="cmds:Login.CmdLogin" HorizontalAlignment="Left" VerticalAlignment="Top" IsDefault="True" Width="200"  Margin="0,0,0,5"/>
    </Grid>
</RibbonWindow>

Mein ViewModelMain (NameSpace: MvvmTest.GUI.ViewModels) ist zur Zeit noch leer.
Für die Commands möchte ich gerne im NameSpace MvvmTest.GUI.ViewModels.Commands jeweils eine Klasse erstellen, in denen dann die gewünschten Aktionen durchgeführt werden sollen.

Eine so eine Klasse sieht z.B. so aus:


namespace MvvmTest.GUI_v2.ViewModels.Commands
{
    public class Login
    {
        public static RoutedUICommand CmdLogin = new RoutedUICommand("Login", "Login", typeof(Login));

        public void Login_CanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = true;
            //e.Handled = true;
        }

        public void Login_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            Console.Beep();
        }
    }
}

Mein Problem ist nun:
wie bekomme ich dem CommandBinding Beigebracht, dass er aus der Klasse Login das CanExecute und Executed aufrufen soll und nicht aus der CodeBehind-Datei? Im XAML Code oben habe ich bereits zwei Möglichkeiten ausprobiert, welche mir logisch erschienen, aber beide nicht funktionieren.

Bei der ersten Variante gibt es den Fehler> Fehlermeldung:

'MvvmTest.GUI.MainWindow' does not contain a definition for 'Login_Executed' and no extension method 'Login_Executed' accepting a first argument of type 'MvvmTest.GUI.MainWindow' could be found (are you missing a using directive or an assembly reference?)

Hier sucht er in der Code-Behind-Datei nach den Methoden.

Bei der zweiten Variante gibt es den Fehler:> Fehlermeldung:

CanExecute="cmds:Login.Login_CanExecute" is not valid. 'cmds:Login.Login_CanExecute' is not a valid event handler method name. Only instance methods on the generated or code-behind class are valid.

Beides kompiliert nicht.

Des weiteren hatte ich auch schon versucht die Login-Klasse sowie die (Can)Execute-Methoden static zu machen, aber auch das hat in der Verzweiflung nichts am Fehler und den Meldungen geändert.

Ich bin ein wenig ratlos und finde auch über den Freund mit den 6 Buchstaben keine Lösung, die mir im Ansatz weiterhilft. In die CodeBehind-Datei möchte ich eigentlich nichts schreiben.

05.02.2014 - 20:59 Uhr

Hi,

Ich benutze für meine Projekte Axialis Icon Workshop (http://www.axialis.com/iconworkshop/). Kostet einmalig etwas Geld und man hat dann einige hundert Icons auf dessen Grundlage man in deren Designer die Icons modifizieren, kombinieren oder wie auch immer verändern kann.
Kann ich nur empfehlen. Ist einfach und unkompliziert.

08.12.2013 - 09:45 Uhr

Hi Mammut,

soweit ich weiß, musst du noch ein PropertyChanged senden.

Dazu musst du zunächst dein Window oder Usercontrol von INotifiyPropertyChanged ableiten.
Dann musst du ein Event "PropertyChangedEventHandler" erstellen.

public event PropertyChangedEventHandler PropertyChanged;

Nachdem dann SelectedKunde und die Liste geändert wurden, rufst du PropertyChanged auf um dem Control mitzuteilen, dass es die Bindings bitte aktualisieren soll.

if (PropertyChanged != null)
{
     PropertyChanged(this, new PropertyChangedEventArgs("ListKunden"));
     PropertyChanged(this, new PropertyChangedEventArgs("SelectedKunde"));
}
07.12.2013 - 21:33 Uhr

So, nachdem ich jetzt den nächsten Tag gesucht habe, ist mir aufgefallen woher der Fehler kommt:
Die Original-Datei der "GenericTreeView.dll" heißt "Hardcodet.Wpf.GenericTreeView.dll". Den Namen habe ich gekürzt. Wenn die Assembly (/Referenz) den Originalname trägt, dann gibt es keinen Fehler.
Was ich aber nicht verstehe ist, warum ich die DLL nicht umbennen kann. Bisher bin ich immer davon ausgegangen, dass letztendlich Namespace etc. wichtig sind und der Dateiname der DLL eigentlich unwichtig ist. War das eine falsche Annahme oder sollte das in der Regel gehen? Wenn es eigentlich gehen sollte, wieso geht es in diesem Fall nicht?
Ich kann im Code nirgends eine Verweis auf den Originalnamen der DLL finden.

07.12.2013 - 14:03 Uhr

Hi,

ich weiß nicht, ob dies direkt mit WPF zu tun hat, aber da mein Fehler auf XAML-Code verweist, mache ich es einmal hier auf. Sollte es woanders ehr hingehören, darf der Thread gerne verschoben werden.

Ich bin derzeit dabei auf Basis dieses TreeViews ein TreeView für meine Bedürfnisse anzupassen.
Ich habe hierbei jedoch ein Problem, welches ich nicht ganz nachvollziehen kann.

Ich habe das "Original" ein wenig reduziert und in ein Test-Projekt von mir eingebunden. Wenn ich jetzt mein Test-Projekt ausführe, bekomme ich eine XamlParseException, die mich auf mein ViewModel verweisst. Die genaue Meldung lautet hier: > Fehlermeldung:

Zeilennummer "9" und Zeilenposition "14" von "Durch das Festlegen von connectionId wurde eine Ausnahme ausgelöst." .
Das Ding ist aber: ich habe nichts, was "connectionId" heißt. Auch das WPF TreeView aus dem oben angegebenen Link hat nichts, dass diesen Namen trägt.
Wenn ich den Projektordner im Explorer nach diesem String durchsuche, dann finde ich ihn in einer .g.cs-Datei. Dort wird es als Parameter übergeben:


void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target)

Die InnerExecption sagt nur > Fehlermeldung:

""Die Datei oder Assembly &quot;Hardcodet.Wpf.GenericTreeView, Version=1.0.6.33174, Culture=neutral, PublicKeyToken=null&quot; oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.":"Hardcodet.Wpf.GenericTreeView, Version=1.0.6.33174, Culture=neutral, PublicKeyToken=null"}". Das klingt für mich ersteinmal so, dass er das TreeView nicht finden kann. Das kann ich erstmal nicht nachvollziehen, weil es im Zielordner vorhanden ist und auch im Designer funktioniert.

Ich habe zwar nun die Erkenntniss, dass das er scheinbar irgendein Problem mit der connectionId hat, aber viel weiter komme ich nicht.

Meine letzten Versuche waren einfach alles nochmal von vorne zu machen, aber auch das läuft immer wieder auf die gleichen Probleme hinaus. Ich kann hierbei auch nicht genau nachvollziehen nach welcher Änderung es nicht mehr geht. Ich war auch schon soweit, dass ich dachte, dass es nun geht, weil in der Testapplikation alles OK war, habe den complile-Modus auf Release gestellt und ab dem Moment ging es nicht mehr - weder im Release noch im Debug-Modus.

Ich habe das Projekt einmal angehägt, vielleicht kann jemand von euch einmal ein Blick drüber werfen? Ich komme hier leider echt nicht weiter 😦

06.12.2013 - 18:47 Uhr

Hi,

danke WinSharp93, das war auf jeden Fall ein guter Tipp.
Ich habe mich dazu entschlossen mein komplettes TreeView neu zu Bauen. Als Ausgang benutze ich dieses TreeView-Control, welches meinen Bedürfnissen schon sehr gut entspricht:
http://www.codeproject.com/Articles/23337/A-Versatile-TreeView-for-WPF
Damit habe ich gerade ein Problem, aber dazu mache ich gleich einmal ein neuen Thread auf.

26.11.2013 - 10:31 Uhr

Hy Syl3x,

danke für deine Antwort. Leider funktioniert das auch nicht.
Weiterhin wird kein get aufgerufen.
Zusätzlich werden nun in meinem Control alle Command-Parameter der im Control enthaltenen Controls mit folgendem Fehler beanstandet:
Error 4 'ConnectionList' property was already registered by 'UserControl'.

Hast du ggf. noch eine Idee?

21.11.2013 - 13:15 Uhr

Moinmoin,

ich habe ein Problem mit Binding.
Ich habe mein Hauptfenster, in dem ich ein eigenes Control haben, in dem u.a. ein Treeview enthalten ist, welches an meine Bedürfnisse angepasst ist.
Jetzt möchte ich den Inhalt des TreeViews via Binding setzen.

Dazu habe ich folgendes im Control gemacht:
C# (DependencyProperty erstellt):

public List<ImagedConnectionTreeViewItem> ConnectionList
        {
            get { return (List<ImagedConnectionTreeViewItem>)GetValue(ConnectionListProperty); }
            set { SetValue(ConnectionListProperty, value); }
        }

        // Using a DependencyProperty as the backing store for ConnectionList.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ConnectionListProperty =
            DependencyProperty.Register("ConnectionList", typeof(List<ImagedConnectionTreeViewItem>), typeof(ImagedConnectionTreeView), new PropertyMetadata(new List<ImagedConnectionTreeViewItem>()));

XAML:
Im Header:

DataContext="{Binding RelativeSource={RelativeSource Self}}"

Im TreeView:


<my:ImagedConnectionTreeViewControl x:Name="tvConnectionList" ItemsSource="{Binding ConnectionList}">

In meinem Window, wo das Control eingebunden ist, versuche ich nun via Binding das ItemsSource (bzw. "ConnectionList") zu setzen:

Im Code:


public List<ImagedConnectionTreeViewItem> ConnectionList
        {
            get 
            {
                List<ImagedConnectionTreeViewItem> tvNodes = new List<ImagedConnectionTreeViewItem>();
                tvNodes.Add(new ImagedConnectionTreeViewItem("Test"));
                tvNodes.Add(new ImagedConnectionTreeViewItem("Test2"));
                tvNodes.Add(new ImagedConnectionTreeViewItem("Test3"));
                tvNodes.Add(new ImagedConnectionTreeViewItem("Test4"));
                tvNodes.Add(new ImagedConnectionTreeViewItem("Test5"));
                tvNodes.Add(new ImagedConnectionTreeViewItem("Test6"));
                return(tvNodes);
            }
        }

XAML:


<my1:ImagedConnectionTreeView Name="tvConnectionList" ConnectionList="{Binding ConnectionList, diag:PresentationTraceSources.TraceLevel=High}"/>

Wenn ich das Binding nicht auf mein Control, sondern auf ein normales TreeView setze, dann werden dort die Einträge eingezeigt. Daher vermute ich, dass beim meinem eigenen Control irgendetwas mit dem Binding nicht hinhaut.
Beim Binding an mein Control wird keines des gets in den Properties aufgerufen. Beim Standard-Treeview jedoch schon.
Das Output des Traces zeigt nur das hier, was aber keine Fehler enthält:> Fehlermeldung:

System.Windows.Data Warning: 56 : Created BindingExpression (hash=40762510) for Binding (hash=38640643)
System.Windows.Data Warning: 58 : Path: 'ConnectionList'
System.Windows.Data Warning: 60 : BindingExpression (hash=40762510): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=40762510): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=40762510): Attach to beRemote.GUI.Controls.Controls.ImagedConnectionTreeView.ConnectionList (hash=14638410)
System.Windows.Data Warning: 67 : BindingExpression (hash=40762510): Resolving source
System.Windows.Data Warning: 70 : BindingExpression (hash=40762510): Found data context element: ImagedConnectionTreeView (hash=14638410) (OK)
System.Windows.Data Warning: 78 : BindingExpression (hash=40762510): Activate with root item ImagedConnectionTreeView (hash=14638410)
System.Windows.Data Warning: 107 : BindingExpression (hash=40762510): At level 0 using cached accessor for ImagedConnectionTreeView.ConnectionList: DependencyProperty(ConnectionList)
System.Windows.Data Warning: 104 : BindingExpression (hash=40762510): Replace item at level 0 with ImagedConnectionTreeView (hash=14638410), using accessor DependencyProperty(ConnectionList)
System.Windows.Data Warning: 101 : BindingExpression (hash=40762510): GetValue at level 0 from ImagedConnectionTreeView (hash=14638410) using DependencyProperty(ConnectionList): List1 (hash=28531151 Count=0) System.Windows.Data Warning: 80 : BindingExpression (hash=40762510): TransferValue - got raw value List1 (hash=28531151 Count=0)
System.Windows.Data Warning: 89 : BindingExpression (hash=40762510): TransferValue - using final value List`1 (hash=28531151 Count=0)

Hat jemand eine Idee? Übersehe ich etwas oder habe ich etwas vergessen?

30.10.2013 - 15:45 Uhr

Ja, das kann ich bestätigen. Bei meiner Suche bin ich da auch drüber gestolpert.

30.10.2013 - 10:25 Uhr

Hi xxMUROxx,

vielen Dank für deine Antwort. Das ist eine Variante an die ich so noch gar nicht gedacht habe. Mal sehen wie ich das umgesetzt bekomme 😉

30.10.2013 - 09:26 Uhr

Hallo zusammen,

möchte gerne beim Start meines Programms die letzte Ansicht des Benutzers, sprich Höhe, Breite und Position sowie Zustand des Fensters, wieder anzeigen.

Ein einfaches

Top="{Binding WindowTop}"

auf die Property WindowTop funktioniert leider nicht.
Ich habe bereits ein wenig recherchiert und herausgefunden, dass das auch so nicht geht, sondern drum herum noch mehr gemacht werden muss. Leider habe ich keinen Artikel gefunden, der mir jetzt zeigt was genau gemacht werden muss.
Hat jemand von euch eine Idee, Beispiel oder Link was ich dabei noch alles beachten muss?

Viele Grüße
Kristian

25.09.2013 - 17:30 Uhr

Hallo zusammen,

wir haben nun unsere zweite Version von beRemote, den Release Preview 2, rausgebracht.
Wie der Name schon sagt: Es ist noch nicht die finale Version. Dazu fehlen noch zu viele Features, aber es ist ein weiterer Schritt in die Richtung.

Wir haben beim Release Preview 2 einige Verbesserungen an der Performance vorgenommen, sowie unser integriertes Pluginsystem erweitert. Außerdem unterstützen wir nun auch VNC und haben einige Verbesserungen an der Benutzeroberfläche vorgenommen (Drag-n-Drop, QuickConnect-Buttons, Tooltips mit Verbindungsinformationen, verbesserte History uvm.).

Ihr seit herzlich eingeladen unser zweites Release zu testen:
Download x86
Download x64

In kürze wird es im übrigen eine Dokumentation zu unserer Plugin-Schnittstelle geben, sodass jeder Plugins für beRemote entwickeln kann.
Für Ideen, Kritik, Featurewünsche und Bugmeldungen sind wir natürlich wie immer dankbar.

PS:
Umgesetzte Änderungen auf Grund eurer Beiträge:

  • Datenbank liegt nun per default unter Appdata
  • Es gibt nun Parameter zum aufrufen von beRemote

PPS:
Wer Lust hat und sofort über neue Features informiert werden möchte, kann uns seit einiger Zeit auch auf Twitter folgen:beRemoteTeam

05.08.2013 - 19:50 Uhr

Hi ErfinderDesRades,

noch eine Kurze Rückmeldung:
der Hinweis mit nicht jedes einzelne Item behandeln war die Lösung, danke!
Dass das MVVM-Pattern derzeit nicht ganz eingehalten wird, ist mir bewusst. Das ist mein erstes WPF-Projekt und die Erfahrung wächst mit der Zeit. Wenn ich weiß was ich tue, werde ich das Control auch nochmal neu schreiben, aber im Moment muss es erstmal nur laufen 😉

Zu Vollständigkeit:
Nachdem ich

<TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type myClasses:ImagedConnectionTreeViewItem}">
                    <EventSetter Event="TreeViewItem.DragOver" Handler="treeView_DragOver"/>
                    <EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop"/>
                    <EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove"/>
                </Style>
            </TreeView.ItemContainerStyle>

durch

<TreeView.Style>
                <Style TargetType="{x:Type my:ImagedConnectionTreeViewControl}">
                    <EventSetter Event="TreeViewItem.DragOver" Handler="treeView_DragOver"/>
                    <EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop"/>
                    <EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove"/>
                </Style>
            </TreeView.Style>

ersetzt habe, war alles wie gewünscht!

Danke nochmal!

27.07.2013 - 12:19 Uhr

Hi

ich habe folgendes Problem. Ich habe in WPF ein Treeview erstellt, welches noch ein paar mehr Funktionalitäten hat. Dazu habe ich ein eigenes TreeViewItem erstellt, welches u.a. ein Icon anzeigen kann. Auch Drag-n-Drop ist implementiert um ein Eintrag an eine andere Stelle im TreeView ziehen zu können.
Die Einträge des Treeviews werden via TreeView.Resources angezeigt und in mein TreeViewItem "umgewandelt".

Nun habe ich das Problem, dass die Root-Elemente des Treeviews dieses Style nicht annehmen. Alle andere TreeViewItems, die den Root-Elementen untergeordnet sind, zeigen das Style korrekt an. Die Root-Elemente werden also z.B. ohne Icon als standard TreeViewItem angezeigt.
Wenn ich den letzten Teil für das Drag-n-Drop rausnehme (den Teil mit TreeView.ItemContainerStyle), dann wird alles korrekt angezeigt, aber Drag-n-Drop funktioniert natürlich nicht mehr.

Hat jemand eine Idee warum das Verhalten so ist und was ich dagegen tun kann?

Hier der XAML-Code:

<my:ImagedConnectionTreeViewControl Background="#FFFFFFFF" Foreground="#FFFFFFFF" Margin="0,-2,0,0" x:Name="tvConnectionList" BorderThickness="0" SelectedItemChanged="tvConnectionList_SelectedItemChanged" AllowDrop="True" >
	<TreeView.ContextMenu>
		<ContextMenu>
			<MenuItem Command="my:ImagedConnectionTreeView.AddFolder" Header="Add Folder" IsEnabled="True" />
			<MenuItem Command="my:ImagedConnectionTreeView.AddSetting" Header="Add Connection" IsEnabled="True" />
		</ContextMenu>
	</TreeView.ContextMenu>
	<TreeView.Resources>
		<Style TargetType="{x:Type myClasses:ImagedConnectionTreeViewItem}">
			<Setter Property="HeaderedItemsControl.HeaderTemplate">
				<Setter.Value>
					<DataTemplate>
						<StackPanel Orientation="Horizontal"
									Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type myClasses:ImagedConnectionTreeViewItem}}}">
							<Image Height="16" Source="{Binding Path=Icon, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type myClasses:ImagedConnectionTreeViewItem}}}" Stretch="Fill" Width="16" />
							<TextBlock Text="{Binding}" />
						</StackPanel>
					</DataTemplate>
				</Setter.Value>
			</Setter>
		</Style>
	</TreeView.Resources>
	<TreeView.ItemContainerStyle>
		<Style TargetType="{x:Type myClasses:ImagedConnectionTreeViewItem}">
			<EventSetter Event="TreeViewItem.DragOver" Handler="treeView_DragOver"/>
			<EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop"/>
			<EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove"/>
		</Style>
	</TreeView.ItemContainerStyle>
</my:ImagedConnectionTreeViewControl>
12.06.2013 - 20:43 Uhr

Hi,

ich brauche einmal einen Rat zu beeVNC, da ich selbst irgendwie nicht weiter komme:

ich habe eine unsichtbare Textbox über das gesamte Control gelegt, damit ich alle Arten von Sonderzeichen etc. abfangen kann. WPF hat da leider (so viel ich herausgefunden habe) keine vernünftige Lösung jedes beliebige Zeichen in einen Keycode umzuwandeln.

Wenn nun also einer einen Text in dem VNC-Fenster eingibt, wird der Text genommen, der eingegeben wurde (nur das 1. Zeichen) und an die Remotesession gesendet. Funktioniert auch soweit so gut. Sondertasten werden hier anders behandelt, aber das tut jetzt nichts zum Problem.

Das Problem fängt nun da an, wo Tastenkombinationen ins Spiel kommen, die auch eine Textbox annimmt (Strg+C, Strg+V, Strg+X usw.).
Hier wird an das Remotefenster nicht das Zeichen (also C, V, X, ...), sondern das Ergebnis des Commands (also Copy, Paste, Cut, ...) an die Remotesitzung übertragen, da ja die lokale Textbox diesen Befehl in das Ergebnis "umwandelt".

Beispiel:
In der Remotesitzung habe ich ein Notepad offen. Zudem habe ich lokal und remote im Zwischenspeicher den Text "super Seite: www.mycsharp.de". Diesen will ich jetzt in das leere Notepad einfügen. Ich drücke also in meiner VNC-Sitzung Strg+V. An die Textbox wird nun aber nicht "Strg+V" gesendet, sondern "Paste". Es wird also der Text "super Seite: www.mycsharp.de" in die Textbox eingefügt. Die Folge: Es wird an die Remoteseite Strg+S gesendet, da das S der erste Buchstabe des eingegebenen Textes ist.

=> Ich muss irgendwie alle Shortcuts der Textbox deaktivieren, sodass er, wenn ich Strg+V drücke, er in der Textbox ein v schreibt statt den Paste-Befehl durchzuführen.

Ich habe bereits folgenden XAML-Code gefunden und getestet:


        <TextBox Name="tbInput" TextChanged="tbInsert_TextChanged" Background="#00000000" Cursor="Cross">
            <TextBox.InputBindings>
                <KeyBinding Key="V" Modifiers="Control" Command="NotACommand" />
            </TextBox.InputBindings>
        </TextBox>

Hierdran stören mich zwei Sachen:

  1. Man müsste für jede mögliche Kombination dieses Binding setzen
  2. Das drücken von Strg+V funktioniert nun gar nicht mehr

Hat jemand noch eine andere Idee?

Wer Lust hat, kann sich den Code auch gerne angucken: http://beevnc.codeplex.com.

Viele Grüße!

11.05.2013 - 20:32 Uhr

Hi,

ich wollte zur Vollständigkeit einmal darauf hinweisen, dass ich mich tatsächlich an eine freie Umsetzung (BSD), basierend auf WPF, gemacht habe.
Zu finden unter https://beevnc.codeplex.com/
Der Entwicklungsstatus ist noch nicht abgeschlossen. Ich würde mal so auf ca. 50% schätzen. Derzeit funktioniert eine unkomprimierte Übertragung des Bildes und Tastatur. Maus geht noch nicht. Ebensowenig der Zwischenspeicher. Optimierungspotential gibt es auch noch bei der Performance und natürlich beim Code...

17.04.2013 - 16:37 Uhr

Hi,
also das es bei größeren Umgebungen ein Admin geben muss, ist soweit klar. Dieser muss dann die Tabellen anlegen oder ggf. Updates an den Tabellen durchführen. Das ist soweit auch so vorgesehen.

Aus meiner Erfahrung in den Unternehmen in denen ich gearbeitet habe kann ich aber sagen, dass die Hemmschwelle kleiner ist etwas bereits existierendes als "Server" zu verwenden (z.B. MSSQL) als etwas neues zu implementieren.
Zudem hat man bei den bestehenden Lösungen mit MSSQL, MySQL oder mit Sicherheit auch bei anderen Datenbanklösungen den Vorteil die Failover- und Hochverfügbarkeitsfeatures mitzubenutzen und nichts eigenes Implementieren zu müssen.

Ein "Problem" ist auch, dass wir noch ziemlich viel im Hinterkopf haben, was wir mit beRemote in etwas fernerer Zukunft alles machen wollen. Dabei werden dann jedoch erheblich mehr Datenmengen zusammenkommen als es jetzt noch der Fall ist.

Zuletzt ist es durch unsere Datenbankschnittstelle aber an sich möglich mit ein bisschen Programmierarbeit jede Datenbank dahinter zu benutzen. Mit dem nächsten Release werden wir das ganze aber auch Dokumentieren. Es ist dann also möglich je nach den eigenen Bedürfnissen die passende Datenbank zu benutzen. MSSQL und MySQL sind dabei halt die verbreitetsten.

Nichts desto trotz bin ich euch sehr dankbar für eure Anregungen. Wir werden die Alternativen zu unseren bisherigen Überlegungen einmal durchsprechen und abwägen ob wir unseren bisherigen Kurs beibehalten oder ob wir doch noch von der einen oder anderen Alternative überzeugt werden, von der wir vorher noch nichts gehört haben oder die bisher nicht in Betracht kam.

17.04.2013 - 13:37 Uhr

Hi,
ja, so groß ist sie nicht, dass ist korrekt. Aber SQLite unterstützt meines Wissens nach keine Stored Procedures. Daher muss z.T. einiges etwas aufwändig "zusammengesucht" werden, was bei MSSQL eine StoredProcedure mit entsprechender Performance machen würde.

Das mit den Netzlaufwerken KANN zu Problemen führen, muss es aber nicht - steht auch so in deinem ersten Link. Im produktiven Testbetrieb (gibt es sowas? 😃) hatten wir zu dritt keine Probleme. Für größere Umgebungen wird es später ohnehin die größeren Datenbanken geben, wo das dann kein Problem mehr dastellt.

Die SQLite-DB ist primär für die Benutzung lokal gedacht. Netzlaufwerk ist zwar möglich, aber wie ich jetzt weiß, kann es problematisch werden.

16.04.2013 - 14:05 Uhr

Ja, er hat auch Recht. Das bestreite ich nicht. Ich habe aber auch geschrieben, dass die DB durchaus in Netzlaufwerken liegen kann/darf und dass man den Pfad anpassen kann sowie dass wir den Standardpfad ändern werden (siehe hier)

16.04.2013 - 13:58 Uhr

Prinzipiell gebe ich dir Recht. Andererseits kann die Datenbank aber auch von mehreren Benutzern von unterschiedlichen Rechnern gleichzeitig benutzt werden. Wir könnten den Default-Pfad für die SQLite-DB allerdings nach %appdata% das users legen.
Im Moment kann zur Anpassung des Pfades in der config.ini die Option dbpath angepasst werden.
Um die Datenbank woanders abzulegen, muss diese Option einfach angepasst werden. Z.B. dbpath=X:\beremote.db
Sollte das mit dem Release-Download nicht funktionieren, teste bitte einmal den aktuellsten Snapshot.

Für die Zukunft ist ohnehin zusätzlich zu der SQLite-Datebank noch die Möglichkeit der Nutzung einer MSSQL bzw. MySQL-Datenbank angedacht. Dies wird auch einige Performanceverbesserungen mit sich bringen.

16.04.2013 - 11:55 Uhr

Hi Pippl,

Zunächst zum Tracker: Du musst dich erst registrieren und anmelden, damit du im Bugtracker Bugs reporten kannst.

Zum Problem:
Wo liegt bei dir beRemote? ggf. in einem Netzlaufwerk?
Die Meldung wirkt so, als hättest du keine Rechte auf den Ordner in dem beRemote liegt. Dort wird aber die Datenbank-Datei angelegt.

15.04.2013 - 22:56 Uhr

Heute haben wir unser erstes PreRelease von beRemote veröffentlicht. Es ist das beRemote Release Preview 1. Ihr könnte es in der Download-Sektion auf www.beremote.net herunterladen oder ihr klickt den Download-Link im ersten Beitrag.
Es gibt noch einige bekannte und unbekannte Bugs. Ihr könnt diese in unserem Bugtracker verfolgen und melden. Der Bugtracker ist erreichbar unter https://tracker.beremote.net.
Zudem könnt ihr immer den letzten Snapshot von beRemote von unserer Website abrufen oder klick hier. Die Snapshots sind allerdings ungeprüft und können im schlimmsten Fall die Datenbank zerstören oder andere schwere Fehler beinhalten. Normalerweise passiert das natürlich nicht, aber man weiß ja nie...

Außerdem suchen wir noch weiterhin Entwickler, die das beRemote-Development-Team unterstützen möchten oder unter eigenem Namen Plugins entwickeln möchten. Wer Interesse hat, kontaktiert uns bitte über den "contact"-Link um unteren Ende der beRemote-Seite oder hier im Forum. Wir haben noch eine Menge vor!

Das Feature Request von m.knigge ist leider noch nicht implementiert, aber wird in Kürze umgesetzt.
Der Verlauf des Feature Requests kann hier verfolgt werden: https://tracker.beremote.net/issues/233

11.04.2013 - 21:09 Uhr

Auf meinem Systtem aktiviere ich Launchy durch einen Hotkey, tippe dann "ssh" gefolgt von dem Hostnamen (der dem PuTTY bekannt sein muss), drücke einmal beherzt auf ENTER und schwupps öffnet sich PuTTY mit der Connection zum angegebenen Host.

Wäre es auch in Ordnung, wenn beRemote bereits läuft und du dann diesen Befehl eingibst? Dann wäre das Thema mit dem Login auch gegessen, da dieser zu dem Zeitpunkt dann ja schon erfolgt ist. In meiner täglichen Arbeit habe ich beRemote jedenfalls den ganzen Tag auf, einfach da ich eigentlich immer Remote irgendwo drauf bin. Daher könnte ich mir vorstellen, dass es bei dir auch so sein könnte.

Wir sind kurz vor dem ersten PreRelease - leider etwas hinter dem Zeitplan, aber besser als ein paar zu viele Bugs zu haben.
Wenn alles nach Plan läuft, gibt es Montag mehr 😉

11.01.2013 - 11:10 Uhr

ich habe gerade gefunden wo das Problem lag.

Ich habe die Variable im MainThread _BackBuffer erzeugt, aber noch nicht initialisiert.
In dem BackgroundWorker habe ich dann - ursprünglich mal zu Testzwecken - der Variable einen Wert zugewiesen. Nachdem ich das entfernt habe, konnte das ProgressChange auch die Variable bearbeiten.
Mir ist das zuerst nicht aufgefallen, weil ich davon ausgegangen bin, dass der BGW die Variable evenfalls nicht erstellen darf ohne auch den Fehler zu erzeugen.

Also der BGW war in Ordnung, die betroffene Variable aber selbst nicht.

Danke für eure Hilfe 😉

07.01.2013 - 18:11 Uhr

Meinem Verständniss nach macht doch der Backgroundworker genau das von alleine?!
Das ProgressChanged sollte doch genau im MainThread ausgeführt werden - steht genau so in dem FAQ-Eintrag 😉

Das _BackBuffer wird im MainThread erzeugt, das ist korrekt.
Das Event wird aus dem Backgroundworker (_Receiver) heraus getriggert. Ausgelöst wird es dann _Receiver_ProgressChanged, was dann ja aber im MainThread sein sollte.
Korrigiere mich, wenn ich falsch liege.

07.01.2013 - 17:58 Uhr

HI,

also ich habe meine E-Mail-Adresse im Profil auf eine andere Adresse geändert und wieder zurück. Dann ging es wieder.
Ist jetzt also erleidigt.

07.01.2013 - 17:23 Uhr

Hi,

ich habe eine Klasse, in welcher ein Thread darauf wartet Daten zu empfangen. Wenn Daten empfangen werden, soll eine Variable, welche nicht in diesem Thread läuft, aktualisiert werden.

Ich habe es bereits mit dem Thread und dem Invoke-Befehl via Dispatcher versucht, aber auch via Backgroundworker.

Mittlerweile ist meine Vermutung, dass das irgendwie an der Klasse liegt und dass ich nicht auf den richtigen Thread zurückkomme.

Die Meldung und zur Vollständigkeit ist im Übrigen die bekannte Meldung:> Fehlermeldung:

Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet.

Hier mal ein wenig Code:

Ich habe ein Usercontrol, welches die Kasse instanziert:

RfbClient _Connection = new RfbClient("192.168.8.24",5900,"abc123");

Die Klasse enthält eine Variable, welche den Inhalt des Bildschirms des Remotesystems enthalten soll sowie den Backgroundworker:


private WriteableBitmap _BackBuffer; //Contains the Backbuffer (/Remotescreen)
private BackgroundWorker _Receiver; //The BackgroundWorkerthread for receiving Data

In der Klasse wird dann das hier durchgeführt um den Backgroundworker zu erstellen und zu starten (der auskommentierte Teil stammt aus dem Versuch, das mit Threads statt dem Backgroundworker zu lösen, jedoch mit dem gleichen Problem):


        private void StartServerListener()
        {
            _Receiver = new BackgroundWorker();
            _Receiver.ProgressChanged += new ProgressChangedEventHandler(_Receiver_ProgressChanged);
            _Receiver.DoWork += new DoWorkEventHandler(Receiver);
            _Receiver.WorkerReportsProgress = true;
            _Receiver.RunWorkerAsync();

            //System.Threading.Thread recThread = new System.Threading.Thread(Receiver);
            //recThread.SetApartmentState(System.Threading.ApartmentState.STA);
            //recThread.IsBackground = true; //Don't make too much trouble
            //recThread.Start();
        }

Das ProgressChanged-Event hat dann folgenden Inhalt:


void _Receiver_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            Byte[,,] changeData = (Byte[,,])e.UserState;

            for (int w = 0; w < changeData.GetLength(0); w++)
            {
                for (int h = 0; h < changeData.GetLength(1); h++)
                {
                    Byte[] pixelData = new Byte[4] {changeData[w, h, 0], changeData[w, h, 1],changeData[w, h, 2],changeData[w, h, 3]};

                    //Update the Backbuffer
                    _BackBuffer.WritePixels(new Int32Rect(w, h, 1, 1), pixelData, 4, 0); //<--- Hier tritt der Fehler auf
                }
            }

            //Update the Screen
            if (ScreenUpdate != null)
            {
                ScreenUpdate(null,null);
            }
        }

Beim Zugriff auf _BackBuffer tritt dann der Fehler auf, wobei auch im Debugger via Intellisense der Fehler zu sehen ist, z.B.> Fehlermeldung:

_BackBuffer.BackBuffer' threw an exception of type 'System.InvalidOperationException'

Ich bin an sich davon ausgegangen, dass es den Thread gibt, welcher beim Erstellen der Klasse erstellt wird und den Thread, welcher meine Daten empfängt. Ich muss nun die Daten aus dem "Emfangs-Thread" in den "Klassen-Thread" bringen, weas mir aber nicht gelingt. Ich vermute mittlerweile, dass durch das Invoken (bei den Threads) oder das ProgressChanged (beim Backgroundworker) ein anderer Thread angesprochen wird.

Hat jemand von euch da eine Idee?

30.12.2012 - 01:43 Uhr

Hi,

Weiterleitungen haben ich nicht. Ich lasse nur zusätzlich von Outlook.com die Mails noch von GMX abrufen - zusätzlich zu meinem lokalen Outlook. Wie bereits gesagt: im Spamordner von GMX und Outlook war nix zu finden. Auf Outlook.com ist auch nichts.

Ich habe aber dennoch mal den GMX Spamfilter deaktiviert und die Domain in Outlook auf die Whiltelist gesetzt.
Mal sehen, was nun kommt.

27.12.2012 - 19:41 Uhr

HI,

also sofern der Betreff nichts mit Potenzmitteln oder Rolexuhren zu tun hat, habe ich da nichts bekommen.
Im GMX-Spam und Outlook-Spam ist nichts zu finden.

27.12.2012 - 18:08 Uhr

OK, ich werde es mal als Feature Request aufnehmen

Ein "unnötiges Login" ist es nur, wenn man es in Verbindung mit einer Domain-Anbindung nutzt, da man nur dort von einer autorisierten Stelle (dem DC) eine echte Autorisierung zur Nutzung erhalten hat. Da das Programm aber nicht ausschließlich Stand-Alone, sondern auch mit zentralen Datenbanken z.B. in Servicedesks eingesetzt werden wird, ist das Login - in welcher Form auch immer; ob automatisch oder nicht - nicht komplett entfernbar.
Zumindest solange wir nicht wollen, dass irgendjemand die in der Datenbank hinterlegten Credentials ohne großen Aufwand entschlüsseln kann.

27.12.2012 - 17:43 Uhr

Hi,

also es ging auf jeden Fall mal - ist aber auch schon eine Weile (>1 Jahr) her.
Anfang Dezember ging es nicht. Für den beRemote-Thread habe ich da schon keine Benachrichtiung erhalten.
In der Favoritenansicht sind die Themen alle drin.
Die Automatische Benachrichtigung habe ich jetzt mal aktiviert. Mal sehen ob das ggf. irgendwas geholfen hat.
Die E-Mail-Adresse ist korrekt.

27.12.2012 - 17:39 Uhr

eine LGPL o. ä. lizenzierte Library ist mir auch nicht bekannt. Aber es kann ja nicht schaden, die Autoren bzgl. einer Lizenzänderung von GPL auf LGPL mal anzuschreiben. Wäre nicht das erste mal, dass ein Autor nachträglich die Lizenz geändert hat. Fragen kostet nix....

Hi, habe ich bereits angefragt (2x) => bisher keine Reaktion

Und wie schoneinmal erwähnt:
Wenn man sich nicht zu 100% sicher ist, ob die eigene Programmlizenz mit der GPL kompatibel ist, muss man entweder selbst GPL nutzen oder auf Alternativen ausweichen oder selbst Alternativen schaffen.

Ich für meinen Teil werde in beRemote keine GPL-Komponente benutzen, für die ich für beRemote keine explizite Ausnahme erhalten habe.
Zudem gibt es meist Alternativen (hier jetzt leider nicht), welche unter BSD, APL, MPL, Ms-PL, LGPL und ähnlichem stehen, welche man alle in seinem Programm nutzen kann, wenn man sich an die Bestimmungen bzgl. Copyright und Codeverteilung etc. halt.

26.12.2012 - 23:20 Uhr

Hi,

ich habe das Problem, dass ich keine Benachrichtigungen zu Themen bekomme. Habt ihr die gleichen Probleme?
Ich setze unter dem Thread den Haken "Benachrichtung: Möchtest Du über weitere Antworten per E-Mail benachrichtig werden?", bekomme aber keine Mails. Im Spam (GMX) ist auch nichts zu finden. Ich habe so in letzter Zeit leider immer wieder Antworten verpasst 😦

26.12.2012 - 19:06 Uhr

Ja... das mit dem Englisch... naja, man versteht was wir meinen - hoffe ich 😉

Das Login ist erforderlich, da es auch zur Verschlüsselung von hinterlegten Credentials genutzt wird.

Eine Übergabe der Logindaten als Parameter wäre aber denkbar, ebenso wie eine Authentifizierung via LDAP. Bei Letzterem müssen wir nur gucken wie dann die Credentialverschlüsselung durchgeführt werden kann. Das ist einer der Gründe, warum wir dies derzeit noch etwas hinten an gestellt haben.

26.12.2012 - 19:01 Uhr

Also beRemote würde auch ohne das Plugin laufen.
Wenn unter "Dynamic Linking" verstanden wird, dass Daten aus der über die beRemote-Hauptapplikation bereitgestellten Datenbank abgerufen warden können und ggf. eine Interaktion mit Teilen der Hauptapplikation stattfinden kann, dann ist es nicht erlaubt, denke ich.

Und eine Auslieferung eines so Grundlegenden Protokolls in dem Gebiet sollte zudem schon wünschenswert sein.

Also das ist meine Meinung aus der Sicht es lieber nicht zu machen, bevor man sich in irgendeiner Weise Ärger einhandelt.

25.12.2012 - 23:51 Uhr

If the program uses fork and exec to invoke plug-ins, then the plug-ins are separate programs, so the license for the main program makes no requirements for them. So you can use the GPL for a plug-in, and there are no special requirements.

Also ich finde das sehr eindeutig.
Wenn das Programm einfach zum aktivieren des Plugins aufgerufen wird, dann ist das Programm ein eigenständiges Programm. => GPL oder nicht ware egal
Aber das findet ja leider nicht statt, zumal die Komponente kein eigenständiges Programm ist.

Da ich finde, dass die Lage da interpretationswürde ist, sollte man lieber auf Nummer Sicher gehen anstatt sich in irgendwelche Lizenzstreitigkeiten zu begeben.

Nichts desto trotz: back to Topic

25.12.2012 - 09:45 Uhr

Hi Herbivore und m.Knigge,

Also ich stimme Herbivore zu, dass es an sich ziemlich eindeutig gehandhabt ist und nicht zulässig ist.

Ich stimme aber auch dem IE-Beispiel von m. Knigge zu - und falsch ist es auch nicht. Und zwar wenn man ein IE-Plugin programmiert und unter GPL veröffentlicht, ist es ja offensichtliche, dass das Plugin für den IE bestimmt ist. Meines Wissens nach, kann man als Ersteller einer GPL-Komponente durchaus Ausnahmen zulassen. d.h. da das Programm - also das Plugin - offensichtlich nicht für ein GPL-Programm bestimmt ist, ist hier von einer Erteilten Ausnahme auszugehen.
Wenn aber das entwickelte GPL-Plugin andere GPL-Komponenten verwendete, müssen diese diese Ausnahme ebenfalls erteilen.

Ja... ganz schön verzwickt der GPL-Kram. Aber wie man es auch dreht und wendet, im Allgemeinen kann man sagen: Wenn irgendetwas genutzt wird, was unter GPL steht, muss alles übergeordnete ebenfalls unter GPL stehen.

Alle anderen Lizenzen - auch LGPL - haben diese virulenz ein Glück nicht.

Nichts desto trotz suche ich immernoch eine VNC-Komponente, die nicht unter GPL steht 😃
Da es die aber offensichtlich nicht zu geben scheint, habe ich parallel damit angefangen eine RFB/VNC-Implementierung zu schreiben. So komplex ist das Protokoll ja ein Glück nicht. Wenn ich damit soweit bin, dass man es nutzen kann, werde ich es hier unter BSD-Lizenz zur Verfügung stellen.
Achja und zwei weiterere Vorteile der eigenen Implementierung:

  1. Ich schreibe es für WPF
  2. Man kennt die Strukturen und kann - wenn man einen dazugehörigen Server entwickelt - eigene Erweiterungen implementieren. Das ist für die Zukunft zu beRemote sicher interessant 😉
24.12.2012 - 15:15 Uhr

Das ist hier ganz gut Ausgeführt:
GPL-Komponente kapseln und in closed-source software verwenden?

if the program uses only simple fork and exec to invoke and communicate with plug-ins, then the plug-ins are separate programs [...] If the program dynamically links plug-ins, and they make function calls to each other and share data structures, [...] In order to use the GPL-covered plug-ins, the main program must be released under the GPL or a GPL-compatible free software license

Das bedeutet zu Deutsch, dass es keine Plugins geben darf, die GPL-Komponente verwenden. Wenn doch ist das gegen die Lizenzvereinbarungen der GPL und der Versacher (in dem Fall der Pluginentwickler) begeht einen einen Lizenzbruch.
Weil: Durch die virulenten Eigenschaften von GPL muss sowohl das "Mutterprojekt", also beRemote, unter GPL stehen, wie auch alles, was aus dem entwickelten Plugin entsteht.
Ja, GPL ist alles andere als frei - darüber sind sich leider viele Entwickler nicht immer im Klaren drüber, was das häufig bedeutet 😦
Es gibt sicherlich solche, die gezielt GPL als Lizenz verwenden. Aber es gibt auch viele (ich behaupte der Großteil), die sich denken "Ich brauche ne OpenSource-Lizenz" und dann GPL nehmen, weil sie die kennen ohne sich allen Konsequenzen - auch für die potentiellen Nutzer - daraus bewusst zu werden.

23.12.2012 - 18:09 Uhr

Hi,

ich baue gerade eine Umsetzung - Zumindest versuche ich es mal.
Hab vor einiger Zeit mal etwas ähnliches gemacht. Das kann ich zwar dafür nicht direkt verwenden, aber mal sehen ob ich mit den TcpClient-Verbindungen etc. noch zurecht komme.

Wenn ich irgendwo nicht weiterkomme, melde ich mich sowieso hier 😉
Es sei denn jemand kennt etwas fertig implementiertes ohne GPL 😉

Ich habe bei ein paar der Projekte bereits angefragt, ob es möglich ware das zu ändern, da z.T. ja sogar explizit gesagt wird, dass man sich melden kann, wenn man etwas anderen haben möchte.
Aber leider bisher von keinem eine Antwort 😦

23.12.2012 - 10:26 Uhr

Hallo zusammen,

kennt jemand von euch eine freie (damit schließe ich die GPL-Lizenz explizit aus!) Implementierung des VNC-Protokolls, welche man in seinen eigenen Projekten verwenden darf? Es geht dabei nur um den Viewer - nicht den Server.
Denkbar wären z.B. Libraries, die unter der BSD oder MS-Public-Lizenz stehen.

Es geht dabei um mein aktuelles Projekt beRemote - Projekt: Remote Connection Manager. Die Implementierung von VNC selbst kann dabei gerne Open Source sein (ist wie alle Protokolle bei beRemote ein Plugin). Die Lizenz darf nicht wie GPL virulent sein, da beRemote im Kern Closed-Source ist.

Auf Codeplex und Sourceforge finde ich leider nur GPL-Lizensierte Bibliotheken.

23.12.2012 - 10:14 Uhr

Hi,

voraussichtlich diese Woche (zwischen Weihnachten und Neujahr) kommt das "Release Preview 1".
Wir haben in den letzten Tagen die Homepage mit einigen Informationen gefüttert, sodass dort schonmal einiges zu erkennen ist, wie es sein wird.
Sobald wir das Release Preview veröffentlichen, geben wir hier natürlich zuerst Bescheid 😃

08.12.2012 - 19:43 Uhr

Hi,

vielen Dank für den Hinweis. Die Namensgleichheit ist uns bekannt. Ich verstehe nur nicht ganz in wiefern das ein Problem ist? Die Dateien werden ja nicht im gleichen Ordner liegen und beRemote ist eine Client-Anwendung mit der man zu Servern (im Regelfall mit den Boardmitteln des Servers) verbindet.

Derzeit ist aber auch der Name der EXE-Datei nicht beremote.exe 😉 Daher sollte es dort keine Probleme geben - wenn man denn beide Dateien in den gleichen Ordner legen möchte.

17.11.2012 - 13:47 Uhr

Hallo zusammen,

ich möchte gerne ein Update für dieses Projekt verkünden und über die Entwicklungen in letzter Zeit berichten.

Zunächst einmal wird das hier vorgestellte Projekt seit Mai vorangetrieben und hat einen Namen bekommen.
Es heißt: beRemote

Wir – ein kleines Team aus zwei Personen – formen mit beRemote ein Stück Software in das unsere Vorstellungen und Ideen seit Beginn der Entwicklung einfließen.

Unsere Zielgruppe für diese Anwendung sind Administratoren und "Power-User", welche mit Remote-Systemen arbeiten und diese nutzen und/oder administrieren.
Da wir selbst als Entwickler und Administratoren in dieser Zielgruppe arbeiten konnten wir gut abschätzen was der Administrator von heute benötigt und bemühen uns diese Visionen in die Tat umzusetzen.
Nun zu unserem aktuellen Stand:
beRemote ist nun kurz vor dem ersten Release, welches wir "Release Preview 1" (RP1) nennen. Es enthält noch bei Weitem nicht alle Funktionen, welche wir im finalen Release sehe möchten, aber die Basisfunktionialität ist gegeben.
In Worten ausgedrückt bedeutet dies, dass bisher vieles möglich ist. Hier einmal ein Auszug der wichtigsten Features:

  • Multitab-Ansicht mehrerer RDP oder Telnet-Verbindungen
  • Unterstützung von RDP-Verbindungen mit NLA
  • Verwalten von Verbindungen in einer Treeview-Ansicht
  • Import von Verbindungen aus mRemote-Konfigurationsdateien
  • Historyfunktion
  • "Stopwatch" als Hilfe für Mitarbeiter in Dienstleistungsunternehmen
  • Credentialmanagement (Hinterlegen von Logindaten)
  • Lizenzmanagement
  • Integrierter Updater mit Proxy-Support
  • Schnittstelle für mehrere Datenbanken (derzeit nur SQLite umgesetzt, weitere folgen nach RP1)

Natürlich fehlen noch sehr viele Funktionen daher im Folgenden eine kleine TODO-Liste was in Zukunft noch so kommen wird:

  • VNC-Support (als Remoteprotokoll)
  • SSH-Support (als Remoteprotokoll)
  • MSSQL-Support (als Datenbank)
  • MySQL-Support (als Datenbank)
  • "Tools & Features" - Viele kleine und große Helferlein für Administratoren
  • Dokumentation der Protokollschnittstelle für 3rd Party Plugins
  • Dokumentation der Datenbankschnittstelle für 3rd Party Plugins
  • Dokumentation der Tools+Features-Schnittstelle für 3rd Party Plugins

Mit jedem Release folgen noch weitere Funktionen, welche jedem, der mit Remotesystemen arbeitet, ein funkeln in die Augen bringen wird. Natürlich verraten wir hier jetzt noch nicht alles, aber es ist es auf jeden Fall wert uns nicht aus den Augen zu verlieren.

Ein paar technische Details:
Die beRemote-GUI basiert ausschließlich auf WPF und wir orientieren uns an MVVM, setzen es aber noch nicht konsequent um. Die Basis von beRemote ist letztendlich ein leeres Gerüst, welches durch Plugins erweitert werden kann. Diese Plugins stellen wir selbst zur Verfügung, geben aber auch anderen Entwicklern die Möglichkeit beRemote selbst zu erweitern. Dies kann in Form von eigenen Remote-Protokollen erfolgen, aber auch in Form von eigenen Helfern, welche in dem Tools+Features-Ribbon integriert sind. Nicht zuletzt ist es auch möglich andere Schnittstellen zu entwickeln um auch aus anderen Programmen "live" Daten in beRemote nutzen zu können.

Zur Lizenz:
beRemote wird kostenlos für jeden sein. Es kann sowohl privat als auch kommerziell in beliebigen Umfang genutzt werden. Spenden sind natürlich gerne gesehen.
beRemote ist überwiegend nicht OpenSource. Einige Teile (z.B. Datenbankschnittstellen) werden jedoch (z.B. zu Demonstrationszwecken) frei zum Download inklusive SourceCode zur Verfügung stehen.

Und nun zuletzt noch etwas in eigener Sache:
Für beRemote suchen wir einen weiteren Entwickler, welcher Erfahrung in WPF haben sollte und bereit ist paar Stunden pro Woche in beRemote zu investieren. Insgesamt gibt es allerdings keine Zeitpläne, an welche jemand festgenagelt wird. Es ist ein Hobby-Projekt, in dem jeder sich seine Zeit selbst einteilen kann. Wir haben mittlerweile eine Recht umfangreiche Infrastruktur die uns beim Entwickeln und Dokumentieren sowie beim Bugtracking sehr gut unterstützt.
Wer Interesse hat unser Team zu verstärken, kann sich gerne bei uns per Mail an support-bei-beremote.net melden. Bitte sendet Kontaktdaten (z.B. Skype/MSN) mit.
Das war es erst mal für heute!
Bis demnächst, wenn wir euch unser erstes Release vorstellen dürfen!