Anzeige

 Backgroundworker und ClipboardMonitor in einer Classe


#1
Hallo @ all,
habe da mal wieder ein Problem, und zwar habe ich eine Methode die immer wenn das was in der Zwischenablage ist feuert.
Dann habe ein Backgroundworker, der soll immer wenn was gefeuert wird, das in das Label schreiben.
Das tut aber nicht so wie ich es mir erhoffe. Hier der Code:

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using javaDllBindin;
using ClipboardHelper;
using System.Runtime.InteropServices.ComTypes;
using System.Windows;
using System.Threading;


namespace GuiStuff
{
    public partial class Form1 : Form
    {
        BackgroundWorker bw;
        string tedt = "test";
        public Form1()
        {
            InitializeComponent();           
        }

        private void ClipboardMonitor_OnClipboardChange(ClipboardFormat format, object data)
        {
            tedt = data.ToString();
            bw.ReportProgress(0, tedt);
        }

        private void GetShareDataCyclic(object sender, DoWorkEventArgs e)
        {
            ClipboardMonitor.Start();
            ClipboardMonitor.OnClipboardChange += new ClipboardMonitor.OnClipboardChangeEventHandler(ClipboardMonitor_OnClipboardChange);
        }


        private void UpdateList(object sender, ProgressChangedEventArgs e)
        {
            label1.Text = e.UserState.ToString();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            bw = new BackgroundWorker();
            bw.WorkerReportsProgress = true;
            bw.ProgressChanged += new ProgressChangedEventHandler(UpdateList);
            bw.DoWork += new DoWorkEventHandler(GetShareDataCyclic);
            bw.RunWorkerAsync();
            //var zted = new StartSikuli();
            //zted.StartthatSikuli();
            label1.Text = "atest";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            ClipboardMonitor.Stop();
        }
    }
}
Weiß Jemand wo der Fehler ist?
Danke im Voraus
 

Spyke

Capoeirista
Premium-User
#2
Der BackgroundWorker scheint mir überflüssig.

DoWork (GetShareDataCyclic) startet ja nur den Monitor und abonniert das event.
Danach ist dein BackgroundWorker auch schon fertig.

Probiers mal ohne BackgroundWorker.
 
#3
Hallo nochmal,
nein das hatte nicht funktioniert, aber der Backgroundworker war der falsche Ansatz. Das ganze muss mit nem Invoke Delegate gemacht werden, bsp. hier:

C++:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using javaDllBindin;
using ClipboardHelper;
using System.Runtime.InteropServices.ComTypes;
using System.Windows;
using System.Threading;


namespace GuiStuff
{
    public partial class Form1 : Form
    {
        string tedt = "test";
        public Form1()
        {
            InitializeComponent();
          
        }

        private void ClipboardMonitor_OnClipboardChange(ClipboardFormat format, object data)
        {

            tedt = data.ToString();
            Clipboard.Clear();
            MethodInvoker Labelupdate = delegate
            {
                label1.Text = tedt;
            };
            Invoke(Labelupdate);
           
        }

        private void button1_Click(object sender, EventArgs e)
        {
            doit();
            //var zted = new StartSikuli();
            //zted.StartthatSikuli();
            label1.Text = "";
        }
        private void doit ()
        {
            ClipboardMonitor.Start();
            ClipboardMonitor.OnClipboardChange += new ClipboardMonitor.OnClipboardChangeEventHandler(ClipboardMonitor_OnClipboardChange);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            ClipboardMonitor.Stop();
            label1.Text = tedt;
        }
    }
}
Jetzt tut es auf jedenfall. Trotzdem danke für die moralische Unterstüzung!!!! :)
 
Anzeige

Neue Beiträge

Anzeige