2008-09-25 9 views
1

Мне нужно показать диалог захвата камеры в приложении Compact Framework 3.7, выведя SHCameraCapture из dll Aygshell.dll. Я не могу использовать управляемый объект CameraCaptureDialog из-за ограничений с технологией, с которой я работаю. Вместо этого мне нужно получить к нему доступ, используя его.Как мне выполнить функцию SHCameraCapture (диалог камеры) от Aygshell.dll от WinMO6

См. http://msdn.microsoft.com/en-us/library/aa454995.aspx для документации по этой функции. Функция принимает структуру, которая определяет параметры диалога. например где сохранить файл, какое разрешение использовать.

Я бы понял, что мне нужно будет определить копию структуры в C# и украсить sturct с атрибутом StructLayout. Я также предполагаю, что код будет включать [DllImport ("aygshell.dll")]. Любой образец кода, как назвать это, будет высоко оценен.

ответ

0

Я не был в состоянии проверить это, но ваша структура/функция должна выглядеть следующим образом:

struct SHCAMERACAPTURE { 
    public Int32 cbSize; 
    public IntPtr hwndOwner; 

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] 
    public string szFile; 

    [MarshalAs(UnmanagedType.LPStr)] 
    string pszInitialDir; 

    [MarshalAs(UnmanagedType.LPStr)] 
    string pszDefaultFileName; 

    [MarshalAs(UnmanagedType.LPStr)] 
    string pszTitle; 

    Int32 StillQuality; 
    Int32 VideoTypes; 
    Int32 nResolutionWidth; 
    Int32 nResolutionHeight; 
    Int32 nVideoTimeLimit; 
    Int32 Mode; 
} 

[DllImport("aygshell.dll")] 
static extern int SHCameraCapture(ref SHCAMERACAPTURE pshcc); 

AFAIK, вам не нужно явно установить StructLayout на SHCAMERCAPTURE, поскольку нет ничего необычного его расположение.

Как только вы получите эту работу, вы можете опубликовать свои выводы на pinvoke.net для других, чтобы использовать их!

1

Groky, это хорошее начало ... Спасибо, что начали это. Я попытался подключить это, но получить исключение NotSupportedException.

Я вставлял текст из своего тестового приложения ниже. Обратите внимание, что я попытался украсить структуру с помощью [StructLayout (LayoutKind.Sequential)]. Я также заставил всех членов общественности устранить любые проблемы с доступностью объектов.

public partial class Form1 : Form 
{ 
    [DllImport("aygshell.dll")] 
    static extern int SHCameraCapture(ref SHCAMERACAPTURE pshcc); 

    [StructLayout(LayoutKind.Sequential)] 
    struct SHCAMERACAPTURE 
    { 
     public Int32 cbSize; 
     public IntPtr hwndOwner; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] 
     public string szFile; 
     [MarshalAs(UnmanagedType.LPStr)] 
     public string pszInitialDir; 
     [MarshalAs(UnmanagedType.LPStr)] 
     public string pszDefaultFileName; 
     [MarshalAs(UnmanagedType.LPStr)] 
     public string pszTitle; 
     public Int32 StillQuality; 
     public Int32 VideoTypes; 
     public Int32 nResolutionWidth; 
     public Int32 nResolutionHeight; 
     public Int32 nVideoTimeLimit; 
     public Int32 Mode; 
    } 
    private void ShowCamera() 
    { 
     SHCAMERACAPTURE captureData = new SHCAMERACAPTURE 
              { 
               cbSize = sizeof (Int64), 
               hwndOwner = (IntPtr)0, 
               szFile = "\\My Documents", 
               pszDefaultFileName = "picture.jpg", 
               pszTitle = "Camera Demo", 
               StillQuality = 0, 
               VideoTypes = 1, 
               nResolutionWidth = 480, 
               nResolutionHeight = 640, 
               nVideoTimeLimit = 0, 
               Mode = 0 
              }; 
     SHCameraCapture(ref captureData); 
    } 
    private void button1_Click(object sender, EventArgs e) 
    { 
     ShowCamera(); 
    } 
+0

Хм, я боюсь, что я не в состоянии попробовать код, как я не получил компактную структуру установлен. Однако «\\ Мои документы» - это папка оболочки, а не допустимый путь к файловой системе. Попробуйте использовать полный путь к файловой системе. (Если в компактной структуре все работает по-другому, в этом случае, пожалуйста, не обращайте внимания!) – Grokys 2008-09-27 10:49:52

2

этот код работает ....

#region Enumerations 

public enum CAMERACAPTURE_STILLQUALITY 
{ 
    CAMERACAPTURE_STILLQUALITY_DEFAULT = 0, 
    CAMERACAPTURE_STILLQUALITY_LOW = 1, 
    CAMERACAPTURE_STILLQUALITY_NORMAL = 2, 
    CAMERACAPTURE_STILLQUALITY_HIGH = 3 
} 
public enum CAMERACAPTURE_VIDEOTYPES 
{ 
    CAMERACAPTURE_VIDEOTYPE_ALL = 0xFFFF, 
    CAMERACAPTURE_VIDEOTYPE_STANDARD = 1, 
    CAMERACAPTURE_VIDEOTYPE_MESSAGING = 2 
} 

public enum CAMERACAPTURE_MODE 
{ 
    CAMERACAPTURE_MODE_STILL = 0, 
    CAMERACAPTURE_MODE_VIDEOONLY = 1, 
    CAMERACAPTURE_MODE_VIDEOWITHAUDIO = 2 
} 

#endregion //Enumerations 

#region Structures 

[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)] 
public struct struSHCAMERACAPTURE 
{ 
    public uint cbSize; 
    public IntPtr hwndOwner; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] 
    public String szFile; 
    [MarshalAs(UnmanagedType.LPTStr)] 
    public String pszInitialDir; //LPCTSTR 
    [MarshalAs(UnmanagedType.LPTStr)] 
    public String pszDefaultFileName; //LPCTSTR 
    [MarshalAs(UnmanagedType.LPTStr)] 
    public String pszTitle; //LPCTSTR 
    public CAMERACAPTURE_STILLQUALITY StillQuality; 
    public CAMERACAPTURE_VIDEOTYPES VideoTypes; 
    public uint nResolutionWidth; 
    public uint nResolutionHeight; 
    public uint nVideoTimeLimit; 
    public CAMERACAPTURE_MODE Mode; 
} 
#endregion //Structures 

#region API 
[DllImport("Aygshell.dll", SetLastError = true,CharSet=CharSet.Unicode)] 
public static extern int SHCameraCapture 
(
    ref struSHCAMERACAPTURE pshCamCapture 
); 

private string StartImager(String strImgDir, String strImgFile, uint uintImgHeight, 
          uint uintImgWidth) 

try 
{ 
    struSHCAMERACAPTURE shCamCapture = new struSHCAMERACAPTURE(); 

    shCamCapture.cbSize = (uint)Marshal.SizeOf(shCamCapture); 
    shCamCapture.hwndOwner = IntPtr.Zero; 
    shCamCapture.szFile = "\\" + strImgFile; //strImgDir + "\\" + strImgFile; 
    shCamCapture.pszInitialDir = "\\"; // strImgDir; 
    shCamCapture.pszDefaultFileName = strImgFile; 
    shCamCapture.pszTitle = "PTT Image Capture"; 
    shCamCapture.StillQuality = 0; // CAMERACAPTURE_STILLQUALITY.CAMERACAPTURE_STILLQUALITY_NORMAL; 
    shCamCapture.VideoTypes = CAMERACAPTURE_VIDEOTYPES.CAMERACAPTURE_VIDEOTYPE_STANDARD; 
    shCamCapture.nResolutionHeight = 0; // uintImgHeight; 
    shCamCapture.nResolutionWidth = 0; // uintImgWidth; 
    shCamCapture.nVideoTimeLimit = 10; 
    shCamCapture.Mode = 0; // CAMERACAPTURE_MODE.CAMERACAPTURE_MODE_STILL; 

    //IntPtr intptrCamCaptr = IntPtr.Zero; 

    //Marshal.StructureToPtr(shCamCapture, intptrCamCaptr, true); 

    int intResult = SHCameraCapture(ref shCamCapture); 
    if (intResult != 0) 
    { 
     Win32Exception Win32 = new Win32Exception(intResult); 
     MessageBox.Show("Error: " + Win32.Message); 
    }    

    return strCaptrErr; 
} 

catch (Exception ex) 
{ 
    MessageBox.Show("Error StartImager : " + ex.ToString() + " - " + strCaptrErr 
        , "Nomad Imager Test"); 
    return ""; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^