0
C#プログラムで2つの異なるスレッドを開始しています。最初のものはクリップボードを盗聴すべき形式であり、2番目はクリップボードに書き込むJavaプログラムを開始するものです。 呼び出しは次のようになります。C#でのAutoResetEventとフォームの呼び出し
new Thread(() => StartClipListening()).Start();
new Thread(() => executeScripts(path2Sikuli, path2Scripts, SikVars)).Start();
SuccFailEvent.WaitOne();
SuccFailEvent.Reset();
2番目のスレッドが正常に動作しているが、それもクリップボード盗聴を開始する前に閉じた後、最初に呼ばれると、書き込みされています。私は、次のものをやっている形式で
private void StartClipListening()
{
var clites = new CBForm();
clites.Start_Lintening(this);
clites.Show();
}
:
public void Start_Lintening(TradingExecution trex)
{
this.trex = trex;
//this.are = are;
AddClipboardFormatListener(this.Handle);
}
const int WM_CLIPBOARDUPDATE = 0x31D;
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_CLIPBOARDUPDATE:
IDataObject iData = Clipboard.GetDataObject();
if (iData.GetDataPresent(DataFormats.Text))
{
label1.Text = (string)iData.GetData(DataFormats.Text);
trex.ClipboardMonitor_OnClipboardChange (label1.Text);
Stop_listening();
this.Close();
}
break;
default:
base.WndProc(ref m);
break;
}
}
public void Stop_listening()
{
RemoveClipboardFormatListener(this.Handle);
}
と呼ばれる方法はこの1つである:あなたのために事前に
public void ClipboardMonitor_OnClipboardChange(string data)
{
var ClipboardText = data;
string[] dataInSlices = ClipboardText.Split(';');
try
{
Clipboard.Clear();
}
catch (Exception)
{
}
if (dataInSlices.Count() > 1)
{
if (dataInSlices[1] == "Success")
{
logger.Info("Sccess executing Sikuli");
SuccessExecute = true;
FailureStep = 0;
Failureval = dataInSlices[2];
SuccFailEvent.Set();
}
else if (dataInSlices[1] == "Failure")
{
logger.Info("Failure executing Sikuli");
try
{
FailureStep = Int32.Parse(dataInSlices[0]);
}
catch (Exception)
{
}
SuccessExecute = false;
Failureval = dataInSlices[2];
SuccFailEvent.Set();
}
}
}
おかげ それはこのようになります助けて!
ワーカースレッドからクリップボードにアクセスすることはできません。 STAスレッドとApplication.Run()が必要です。 Winformsアプリケーションのメインスレッドは十分に良いですが、WM_CLIPBOARDUPDATEのポイントはクリップボードの変更を待つ必要はありません。 –