- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经尝试让这项工作有一段时间了...阅读了很多帖子,但没有一个可以解决这个问题。
我正在使用 Canon SDK 连接到 EOS 550D。我正在运行 win7 64 位和 Visual Studio c# 2010。
我一步一步做的是:
--> 0 初始化SDK
err = EDSDK.EdsInitializeSDK();
--> 1 获取摄像头列表
err = EDSDK.EdsGetCameraList(out cameraList);
--> 2 获取 child 数量
err = EDSDK.EdsGetChildCount(cameraList, out cameraCount);
--> 3 如果有 child ,取第一个 child
err = EDSDK.EdsGetChildAtIndex(cameraList, 0, out cameraDev);
--> 4 打开 session
err = EDSDK.EdsOpenSession(cameraDev);
--> 5 告诉sdk将图片保存到本地
IntPtr saveTo = (IntPtr)EDSDK.EdsSaveTo.Host;
err = EDSDK.EdsSetPropertyData(cameraDev, EDSDK.PropID_SaveTo, 0, 4, saveTo);
--> 6 设置宿主机可用容量
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 注册状态事件处理器
err = EDSDK.EdsSetCameraStateEventHandler(cameraDev, EDSDK.StateEvent_All, stateEventHandler, new IntPtr(0));
--> 8 注册对象事件处理器
EDSDK.EdsObjectEventHandler edsObjectEventHandler = new EDSDK.EdsObjectEventHandler(objectEventHandler);
err = EDSDK.EdsSetObjectEventHandler(cameraDev, EDSDK.ObjectEvent_All, edsObjectEventHandler, IntPtr.Zero);
....
执行此操作时我没有收到任何错误,一切似乎都很好。
这是我的处理程序
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;
}
...
所以现在我的问题是没有调用任何处理程序。不知道为什么,我在 net fpr 上搜索了很长时间,尝试了不同的方法但没有得到回调...
这是我调用拍照命令的方法:
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");
}
}
也许有人知道我可以尝试使这项工作成功?
提前致谢!
最好的问候,托拜厄斯
最佳答案
我知道 SDK 文档说回调函数将在另一个线程中执行,但对我来说,在 Windows 下使用 SDK 2.11,回调总是发生在主线程上,并且似乎是通过 Windows 消息发送的。这意味着如果您没有消息泵,您将无法获得回调。如果您的应用程序是 C# GUI 应用程序,您应该有一个消息泵,但如果它是一个控制台应用程序,您可能没有,因此请尝试在发送 TakePicture 命令后手动泵送消息。您可以使用 Application.Run 但您需要在某处调用 Application.Exit 否则您的消息循环将永远不会退出(例如,您可以在从相机下载图片后调用它)。
关于c# 佳能 SDK : No callback after CameraCommand_TakePicture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13669312/
我已经尝试让这项工作有一段时间了...阅读了很多帖子,但没有一个可以解决这个问题。 我正在使用 Canon SDK 连接到 EOS 550D。我正在运行 win7 64 位和 Visual Studi
我是一名优秀的程序员,十分优秀!