2008-09-25 1 views
1

dll Aygshell.dll에서 SHCameraCapture를 pinvoking하여 Compact Framework 3.7 응용 프로그램에서 카메라 캡처 대화 상자를 표시해야합니다. 내가 사용하고있는 기술의 한계로 인해 관리 대상 CameraCaptureDialog를 사용할 수 없습니다. 대신, 나는 그것을 Pinvoking하여 액세스해야합니다.어떻게해야합니까? WinMO6의 Aygshell.dll에서 SHCameraCapture (카메라 대화 상자)를 묻는 방법

기능에 대한 문서는 http://msdn.microsoft.com/en-us/library/aa454995.aspx을 참조하십시오. 이 함수는 대화 상자의 매개 변수를 정의하는 구조체를 사용합니다. 예 : 파일을 저장할 위치, 사용할 해상도.

나는 C#에서 구조체의 복사본을 정의하고 strct를 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, 당신은 명시 적으로 SHCAMERCAPTURE에 StructLayout를 설정할 필요가 없습니다를 그 레이아웃.

일단이 작업을하게되면, 다른 사람들이 사용할 수 있도록 결과를 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

흠, 난 내가 설치 한 컴팩트 프레임 워크를 가지고 적이 없다 같은 코드를 시도 할 수 없어요 두려워. 그러나 "\\ My Documents"는 유효한 파일 시스템 경로가 아닌 쉘 폴더입니다. 전체 파일 시스템 경로를 사용해보십시오. (컴 볼트 프레임 워크에서 일이 다르게 작동하지 않는 한 무시하십시오!) – Grokys

+0

@Groky : 틀렸어, 그 길이야. 장치에는 드라이브 문자가 없습니다. – ctacke

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 ""; 
} 
관련 문제