Como faço para pinvoke a função SHCameraCapture (diálogo camera) de Aygshell.dll de WinMO6

votos
1

Eu preciso mostrar um diálogo de captura de câmera em um 3.7 aplicação estrutura compacta por pinvoking SHCameraCapture do dll Aygshell.dll. I cannont usar o CameraCaptureDialog objeto gerenciado por causa das limitações com a tecnologia Eu estou trabalhando com. Em vez disso, eu preciso acessá-lo por Pinvoking-lo.

Veja http://msdn.microsoft.com/en-us/library/aa454995.aspx para documentação sobre a função. A função leva em uma estrutura que define os parâmetros do diálogo. por exemplo, onde deseja salvar o arquivo, o que resolução a ser usada.

Eu imagem que eu teria que definir uma cópia do struct em C # e decorar o sturct com o atributo StructLayout. Imagino também que o código envolveria [DllImport ( aygshell.dll)]. Qualquer código de exemplo de como chamar isso seria muito apreciado.

Publicado 25/09/2008 em 21:44
fonte usuário
Em outras línguas...                            


3 respostas

votos
2

esse código funciona ....

#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 "";
}
Respondeu 06/03/2009 em 18:48
fonte usuário

votos
1

Groky, este é um bom começo ... Obrigado por conseguir isso começou. Eu tentei fiação isso, mas obter um NotSupportedException.

Eu colei o texto do meu aplicativo de teste abaixo. Note que eu tentei decorar a estrutura com [StructLayout (LayoutKind.Sequential)]. Eu também fez todos os membros do público para eliminar quaisquer problemas com objeto acessibilidades.

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();
    }
Respondeu 26/09/2008 em 16:35
fonte usuário

votos
0

Eu não tenho sido capaz de testar isso, mas a sua função / struct deve ser algo como isto:

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, você não precisa definir explicitamente StructLayout em SHCAMERCAPTURE como não há nada de incomum sobre o seu layout.

Uma vez que você começar este trabalho, você pode querer publicar suas descobertas para pinvoke.net para os outros a fazer uso de!

Respondeu 26/09/2008 em 10:08
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more