'How to prevent "How do you want to open this file" dialog?

In my app I open a report using HTML file as such:

//pStrPath is file:///C:/Users/appts/AppData/Local/Temp/Report_View.htm
ShellExecute(hParentWnd, L"", pStrPath, NULL, NULL, SW_SHOW);

On my development machine it opens up in a web browser, but when I just tested it on a new installation of Windows 10, it showed this dialog instead:

enter image description here

So how can I prevent it from being shown and go with "keep using this app" option from the get-go? Otherwise it may be very confusing for my users.

PS. Note that Edge is installed and can open .htm files if I double-click them.



Solution 1:[1]

Referring to Launching Applications (ShellExecute, ShellExecuteEx, SHELLEXECUTEINFO) we note the text


Object Verbs

The verbs available for an object are essentially the items that you find on an object's shortcut menu. To find which verbs are available, look in the registry under HKEY_CLASSES_ROOT\CLSID{object_clsid}\Shell\verb

Commonly available verbs include:

  • edit - Launches an editor and opens the document for editing.
  • find - Initiates a search starting from the specified directory.
  • open - Launches an application. If this file is not an executable file, its associated application is launched.
  • print - Prints the document file.
  • properties - Displays the object's properties.

Given that a double-click is the generally equivalent to selecting "open" in the object's shortcut menu, if we supply the function with the open verb, we can expect the behaviour to mirror that of a user's double-click. - Please see Ken's comment below

As such, we can expect the following code to achieve the desired result.

//pStrPath is file:///C:/Users/appts/AppData/Local/Temp/Report_View.htm
ShellExecute(hParentWnd, L"open", pStrPath, NULL, NULL, SW_SHOW);

Solution 2:[2]

If you are trying to open the default program FROM a 32 bit program in 64 bit Windows the ShellExecute and ShellExecuteEX may display the "How do you want to open this file?" dialog box each time. This is due to the way that the default program registered itself in Windows I think.

I could reproduce this error on Windows 11 fresh install where the Photos is set to the Default Program for .jpg files.

In my case, I found that if I use the ShellExecuteExW function and pass the extension into the .lpClass of SHELLEXECUTEINFOW Type that it works. It should also work with the ShellExecuteExA function

  1. Make sure it's not an exe, reg, bat file, or a URL you are trying to open. It has to be a document type of file.

  2. Use the .lpClass to pass the extension like ".jpg"

  3. Add the SEE_MASK_CLASSNAME As Long = &H1 to the .fMask parameter you are passing in like .fMask = YourMaskValue Or SEE_MASK_CLASSNAME

The reason I think this works is it bypasses any redirection and reads directly from the HKEY_CLASSES_ROOT.jpg

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Christian