Search code examples
c#wpfwinformsfileopenpicker

“Invalid window handle” error when using FileOpenPicker from C# .net framwork 4.7.2 with Microsoft.Windows.SDK.Contracts without UWP


I am trying to use Microsoft.Windows.SDK.Contracts to access the Windows10 API from .net framework WFP application. I want to use the FileOpenPicker() to select the image for OCR processing by Windows.Media.Ocr. But I met the 'Invalid window handle' error when using the picker

I found a post which met the similar a link issue with C++/WinRT. One of the answer point out " The program will crash because the File­Open­Picker looks for a Core­Window on the current thread to serve as the owner of the dialog. But we are a Win32 desktop app without a Core­Window." I think the root cause is the same. But I don't know how to fix from the my code based on .net framework side.

public async void Load()
{
    var picker = new FileOpenPicker()
    {
        SuggestedStartLocation = PickerLocationId.PicturesLibrary,
        FileTypeFilter = { ".jpg", ".jpeg", ".png", ".bmp" },
    };

    var file = await picker.PickSingleFileAsync();
    if (file != null)
    {

    }
    else
    {

    }
}

Error message: System.Exception: 'Invalid window handle.(Exception from HRESULT:0x80070578)'


Solution

  • Create a file with:

    using System;
    using System.Runtime.InteropServices;
    
    namespace <standardnamespace>
    {
        [ComImport]
        [Guid("3E68D4BD-7135-4D10-8018-9FB6D9F33FA1")]
        [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        public interface IInitializeWithWindow
        {
            void Initialize(IntPtr hwnd);
        }
    }
    

    change your code to:

    public async void Load()
    {
        var picker = new FileOpenPicker()
        {
            SuggestedStartLocation = PickerLocationId.PicturesLibrary,
            FileTypeFilter = { ".jpg", ".jpeg", ".png", ".bmp" },
        };
    
        ((IInitializeWithWindow)(object)picker).Initialize(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle);    
    
        var file = await picker.PickSingleFileAsync();
        if (file != null)
        {
    
        }
        else
        {
    
        }
    }