ralle211 Posted September 9, 2011 Posted September 9, 2011 Ich habe einen Krämer V700 7" USB Monitor ohne Touch und will diesen als Infobildschirm verwenden. Ich habe getestet: - Das Tool "Touchscreen" welches gut aussieht, aber ständig abstürzt und viel zu viel Funktionen hat. - Das Tool "DVBviewerInfo" welches jedoch grafisch nicht das ist was ich suche. - Diverse andere die auch nicht so das waren was ich suche. Also habe ich angefangen eins in C# mit der DVBViewerService.dll selber zu schreiben. Soweit klappen die Grundfunktionen. Jedoch weiß ich nicht wie ich die Senderlogos über die DLL bekommen kann. Den Sendernamen habe ich ja ganz einfach auslesen können. Was ich brauen will ist ein Screen 800x480 welcher folgende Daten enthält: - Netten Background welchen ich shon habe - Sendername incl. Senderlogo aus DVBViewer Ordner - aktuelle Sendung mit Fortschrittsanzeige, nächste Sendung Hat jemand eine Beschreibung der DVBViewerServer.dll oder nen Quellcode woran man etwas lernen kann? Leider sind bei den ganzen von mir getesteten kleinen Tools nie der Quellcode mit dabei gewesen. Meine aktuellen Herausforderungen sind: - Senderlogo anzeigen. - das Ganze mit den Threads. Vielleicht steige ich auf ne andere Sprache um. Ich bin doch sicher nicht der einzige der sowas programmiert, oder Quote
Elektriker Posted September 16, 2011 Posted September 16, 2011 Nee, da bist Du sicher nicht der Einzige. Ich hab vor langer Zeit mal DVBTouch angefangen. Leider liegt das aus Zeitgründen schon länger auf Eis Ist aber für Deine Zwecke auch überdimensioniert. Das Senderlogo musst Du selbst aus dem Unterverzeichnis des DVBViewers laden. Die Pfad erhälst Du über den DataManger der DVBViewer-API. In VB.Net würde das so gehen: Dim LogoPfad as String LogoPfad = DVBViewerObj.DataManager.Value("#channellogo") In deiner Form erstellst Du dir eine PictureBox, in die Du das Senderlogo lädtst: PictureBox.Image = Image.FromFile(LogoPfad) Das ganze musst Du natürlich nach jedem Senderwechsel aktualisieren. Quote
ralle211 Posted September 17, 2011 Author Posted September 17, 2011 Hey vielen dank. Das mit dem Logo klappt ganz gut. Jedoch hap ich ein Problem mit dem channelchange Event. Wenn ich mein Tool laufen lass geht der Event ein paar mal und dann nicht mehr. Ich nutze das Event und nen Timer. Der Timer aktualisiert jede Minute die Anzeige. Das geht auch immer. Den Code poste ich dann gleich mal. Quote
ralle211 Posted September 17, 2011 Author Posted September 17, 2011 Hier mal mein erster Wurf. Wie gesagt, das "channelchange" Event geht nur eine kurze Zeit. Danach reagiert es nicht mehr. Auch im Debug-Mode nicht. Das Timer-Event geht aber dann immer noch. Die try/catch Teile habe benutze ich weil nicht bei jeden Sender bei mir Infos da sind. Mache ich da was mit den Threads falsch?? using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Diagnostics; using DVBViewerServer; namespace DVBviewer_USBepg { public partial class Form1 : Form { public static DVBViewerServer.IDVBViewer dvb; public Form1() { InitializeComponent(); } public void Form1_Load(object sender, EventArgs e) { int i = 0; string s = ""; while(Screen.AllScreens[i].Primary!=false) { i++; } this.DesktopLocation = Screen.AllScreens[i].Bounds.Location; dvb = (DVBViewerServer.IDVBViewer)System.Runtime.InteropServices.Marshal.GetActiveObject("DVBViewerServer.DVBViewer"); DVBViewerEvents dvbVEventsObj = dvb.Events; dvbVEventsObj.OnChannelChange += new DVBViewerServer.IDVBViewerEvents_OnChannelChangeEventHandler(Events_OnChannelChange); timer1.Interval = 1000 *(60 - DateTime.Now.Second); timer1.Start(); screen_refresh(0); } private void Events_OnChannelChange(int ChannelNr) { System.Threading.ThreadPool.QueueUserWorkItem(screen_refresh); } private void timer1_Tick(object sender, EventArgs e) { screen_refresh(0); } private void screen_refresh(object dummy) { MethodInvoker LabelUpdate = delegate { string slogo; lblSender.Text = dvb.CurrentChannel.Name; lblUhr.Text = DateTime.Now.TimeOfDay.Hours.ToString() + ":" + DateTime.Now.TimeOfDay.Minutes.ToString(); if (DateTime.Now.TimeOfDay.Minutes < 10) { lblUhr.Text = DateTime.Now.TimeOfDay.Hours.ToString() + ":0" + DateTime.Now.TimeOfDay.Minutes.ToString(); } else { lblUhr.Text = DateTime.Now.TimeOfDay.Hours.ToString() + ":" + DateTime.Now.TimeOfDay.Minutes.ToString(); } try { lblEPGnow.Text = dvb.DataManager.get_Value("#TV.Now.start"); } catch { lblEPGnow.Text = "Keine Information"; } try { lblEPGnext.Text = dvb.DataManager.get_Value("#TV.Next.start"); } catch { lblEPGnext.Text = "Keine Information"; } try { lblEPGtextNow.Text = dvb.EPGManager.EPGNow.Title.ToString(); } catch { lblEPGtextNow.Text = "Keine Information"; } try { lblEPGtextNext.Text = dvb.EPGManager.EPGNext.Title.ToString(); } catch { lblEPGtextNext.Text = "Keine Information"; } try { lblEPGdescription.Text = dvb.EPGManager.EPGNow.Description.ToString(); } catch { lblEPGdescription.Text = "Keine Information"; } try { lblRest.Text = dvb.DataManager.get_Value("#TV.Now.remain"); } catch { lblRest.Text = "--:--"; } slogo = dvb.DataManager.get_Value("#channellogo"); picLogo.Load(slogo); try { progressBarEx1.Value = Convert.ToInt16(dvb.DataManager.get_Value("#TV.Now.percentage")); } catch { progressBarEx1.Value = 0; } timer1.Interval = 1000 *(60 - DateTime.Now.Second); this.Refresh(); }; Invoke(LabelUpdate); } } } Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.