Ich habe versucht, dies seit einiger Zeit zu machen ... Lesen Sie viele Beiträge, aber keiner von ihnen konnte dieses Problem beheben.C# Canon SDK: Kein Rückruf nach CameraCommand_TakePicture
Ich verbinde eine EOS 550D mit dem Canon SDK. Ich bin mit win7 64bit und Visual Studio C# 2010
Was ich Schritt für Schritt zu tun ist:
-> 0 Init SDK
err = EDSDK.EdsInitializeSDK();
-> 1 Einführung in Kameraliste
err = EDSDK.EdsGetCameraList(out cameraList);
-> 2 Erstes Kind zählt
err = EDSDK.EdsGetChildCount(cameraList, out cameraCount);
-> 3 Wenn ein Kind ist, bekommen erstes Kind
err = EDSDK.EdsGetChildAtIndex(cameraList, 0, out cameraDev);
-> 4 Öffnen einer Sitzung
err = EDSDK.EdsOpenSession(cameraDev);
-> 5 das sdk Telling Bilder lokal speichern
IntPtr saveTo = (IntPtr)EDSDK.EdsSaveTo.Host;
err = EDSDK.EdsSetPropertyData(cameraDev, EDSDK.PropID_SaveTo, 0, 4, saveTo);
-> 6 Einstellen der verfügbaren Kapazität auf dem Host-Rechner
EDSDK.EdsCapacity capacity = new EDSDK.EdsCapacity();
if (err == EDSDK.EDS_ERR_OK)
{
capacity.NumberOfFreeClusters = 0x7FFFFFFF;
capacity.BytesPerSector = 0x1000;
capacity.Reset = 1;
err = EDSDK.EdsSetCapacity(cameraDev, capacity);
}
-> 7 die Registrierung als staatliche Veranstaltung Handler
err = EDSDK.EdsSetCameraStateEventHandler(cameraDev, EDSDK.StateEvent_All, stateEventHandler, new IntPtr(0));
-> 8 die Registrierung als Objekt Event-Handler
EDSDK.EdsObjectEventHandler edsObjectEventHandler = new EDSDK.EdsObjectEventHandler(objectEventHandler);
err = EDSDK.EdsSetObjectEventHandler(cameraDev, EDSDK.ObjectEvent_All, edsObjectEventHandler, IntPtr.Zero);
....
ich nicht einen Fehler während dies zu tun, Alles scheint in Ordnung zu sein.
Hier sind meine Handler
private uint objectEventHandler(uint inEvent, IntPtr inRef, IntPtr inContext)
{
Console.WriteLine("HALLLOOOOOOOOOO");
switch (inEvent)
{
case EDSDK.ObjectEvent_DirItemCreated:
//this.invokeNewItemCreatedEvent(new NewItemCreatedEventArgs(getCapturedItem(inRef)));
Console.WriteLine("Directory Item Created");
break;
case EDSDK.ObjectEvent_DirItemRequestTransfer:
Console.WriteLine("Directory Item Requested Transfer");
break;
default:
Console.WriteLine(String.Format("ObjectEventHandler: event {0}, ref {1}", inEvent.ToString("X"), inRef.ToString()));
break;
}
return 0x0;
}
public uint stateEventHandler(uint inEvent, uint inParameter, IntPtr inContext)
{
Console.WriteLine("stateEventHandler " + inEvent);
switch (inEvent)
{
case EDSDK.StateEvent_JobStatusChanged:
Console.WriteLine(String.Format("There are objects waiting to be transferred. Job status {0}", inParameter));
break;
case EDSDK.StateEvent_ShutDownTimerUpdate:
if (inParameter != 0)
Console.WriteLine(String.Format("shutdown timer update: {0}", inParameter));
break;
case EDSDK.ObjectEvent_DirItemRequestTransfer:
//WHAT I NEED!!!
Console.WriteLine("Hallo DirItemRequestTransfer");
//DownloadImage(obj);
break;
default:
Console.WriteLine(String.Format("StateEventHandler: event {0}, parameter {1}", inEvent, inParameter));
break;
}
return 0;
}
...
Nun mein Problem ist, dass keiner der Handler immer genannt wird. Ich weiß nicht warum, ich searche das Netz fpr einige Zeit versucht, verschiedene Ansätze, aber nicht den Rückruf erhalten ...
Hier ist meine Methode, um die Aufnahme Bild Befehl aufrufen:
public void takePic()
{
if (cameraOpened)
{
Console.WriteLine("taking a shot");
err = EDSDK.EdsSendCommand(cameraDev, EDSDK.CameraCommand_TakePicture, 0);
if (err != EDSDK.EDS_ERR_OK)
Console.WriteLine("TakeCommand Error: " + err.ToString());
Console.WriteLine("Finished taking a shot");
}
}
Vielleicht hat jemand hat eine Idee, was ich versuchen könnte, damit das funktioniert?
Vielen Dank im Voraus!
Mit freundlichen Grüßen, Tobias
Diese hat für mich gearbeitet; Ich hatte zwei Tage damit zu tun gehabt, da die App hinter einem Webserver von Nancy lief, der selbst als Topshelf-Dienst gehostet wurde, Delegierte in F # geschrieben und Kameraanfragen in einem "MailboxProcessor" anordneten, also gab es eine Million Variablen. Es stellt sich heraus, dass dies das Problem ist. Genauer gesagt musste ich 'InitialzeSDK' und' SetCameraAddedHandler' in einem * neuen * Thread aufrufen und 'Application.Run()' am Ende des Threads aufrufen. –
können Sie bitte ein Codebeispiel bereitstellen? –
Schön, dass ich das herausgefunden habe, Sam! –