#ifndef UI_SHELL_DIALOGS_AUTO_CLOSE_DIALOG_EVENT_HANDLER_WIN_H_
#define UI_SHELL_DIALOGS_AUTO_CLOSE_DIALOG_EVENT_HANDLER_WIN_H_
#include <shobjidl_core.h>
#include <wrl.h>
#include <wrl/client.h>
#include "base/threading/thread_checker.h"
namespace ui {
class AutoCloseDialogEventHandler
: public Microsoft::WRL::RuntimeClass<
Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::ClassicCom>,
IFileDialogEvents> {
public:
explicit AutoCloseDialogEventHandler(HWND owner_window);
private:
~AutoCloseDialogEventHandler() override;
HRESULT Initialize(IFileDialog* file_dialog);
void OnWindowDestroyedNotification(HWND window);
static void CALLBACK EventHookCallback(HWINEVENTHOOK handle,
DWORD event,
HWND hwnd,
LONG id_object,
LONG id_child,
DWORD event_thread,
DWORD event_time);
IFACEMETHODIMP OnTypeChange(IFileDialog* pfd) override;
IFACEMETHODIMP OnFileOk(IFileDialog*) override;
IFACEMETHODIMP OnFolderChange(IFileDialog*) override;
IFACEMETHODIMP OnFolderChanging(IFileDialog*, IShellItem*) override;
IFACEMETHODIMP OnSelectionChange(IFileDialog*) override;
IFACEMETHODIMP OnShareViolation(IFileDialog*,
IShellItem*,
FDE_SHAREVIOLATION_RESPONSE*) override;
IFACEMETHODIMP OnOverwrite(IFileDialog*,
IShellItem*,
FDE_OVERWRITE_RESPONSE*) override;
HWND owner_window_ = nullptr;
bool initialize_called_ = false;
HWINEVENTHOOK event_hook_ = nullptr;
HWND dialog_window_ = nullptr;
THREAD_CHECKER(thread_checker_);
};
}
#endif