こんにちは、何度もお世話になっております。
WinAPIでGetSaveFileName()を用いてファイル保存用のコモンダイアログを使用する場合、OPENFILENAME構造体のFlagsにOFN_OVERWRITEPROMPTを指定する事で、既存のファイルと同じ名前のファイルを保存しようとした時に上書き確認用のメッセージを出す事が出来ますが、この上書き確認用のメッセージを経てファイルを保存しようとした時と上書き確認用のメッセージを出さず通常通りにファイルを保存しようとした時とで別々の動作をさせたいと思いました。(具体的にはCreateFile()の第5引数を前者ではTRUNCATE_EXISTING、後者ではCREATE_ALWAYSという風に使い分けたい)
しかし、このコモンダイアログで上書き確認用のメッセージが出たかどうかを判定する方法が思いつきません。
そこでお聞きしますが、GetSaveFileName()を用いて使用するファイル保存用のコモンダイアログにおいて、上書き確認用のメッセージを経てファイルを保存したかどうかを判定する方法はありますか?どなたかよろしくお願いします。
コモンダイアログでの上書き保存と新規保存の判定方法について
Re: コモンダイアログでの上書き保存と新規保存の判定方法について
残念ながら、wasawasaさんが望んでいるような簡単に実現できる方法は恐らく無いです。
上書き保存のボタンが押されたときのメッセージをspy++のmessage viewなどで調べてフックさせるか
自分でカスタムコモンダイアログを作成するしかないと思われます。
(上記の方法やspy++などについては私は説明するつもりはないので他の方に聞くか自分で調べてください)
しかし、望んでいる動作ではないかもしれませんが
保存時にファイルが存在する場合、しない場合の判定は可能です。
以下のような方法はいかがでしょうか?
上書き保存のボタンが押されたときのメッセージをspy++のmessage viewなどで調べてフックさせるか
自分でカスタムコモンダイアログを作成するしかないと思われます。
(上記の方法やspy++などについては私は説明するつもりはないので他の方に聞くか自分で調べてください)
しかし、望んでいる動作ではないかもしれませんが
保存時にファイルが存在する場合、しない場合の判定は可能です。
以下のような方法はいかがでしょうか?
#pragma comment(lib, "Shlwapi.lib")
#include <Shlwapi.h>
#include <windows.h>
#define TITLE TEXT("Kitty on your lap")
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
static OPENFILENAME ofn = { 0 };
static TCHAR strFile[MAX_PATH];
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = TEXT("Text files {*.txt}\0*.txt\0")
TEXT("All files {*.*}\0*.*\0\0");
ofn.lpstrFile = strFile;
ofn.lpstrDefExt = "txt";
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_FILEMUSTEXIST | OFN_OVERWRITEPROMPT;
return 0;
case WM_RBUTTONUP:
if (GetSaveFileName(&ofn))
{
if (PathFileExists(ofn.lpstrFile))
MessageBox(hWnd, "ファイルが見つかった", NULL, 0);
else
MessageBox(hWnd, "ファイルが見つからなかった", NULL, 0);
}
SetWindowText(hWnd, strFile);
return 0;
}
return DefWindowProc(hWnd, msg, wp, lp);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR lpCmdLine, int nCmdShow) {
HWND hwnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL, IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return -1;
hwnd = CreateWindow(
TEXT("KITTY"), TITLE,
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL,
hInstance, NULL
);
if (hwnd == NULL) return -1;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
Re: コモンダイアログでの上書き保存と新規保存の判定方法について
sleepさん、返信ありがとうございます。
上書き確認メッセージの有無の確認が容易ではない事は残念ですが、提示して頂いた方法で代用できそうなので試してみたいと思います。
上書き確認メッセージの有無の確認が容易ではない事は残念ですが、提示して頂いた方法で代用できそうなので試してみたいと思います。