Существует ли вообще возможность сделать так, чтобы пользователь не мог закр. программу при нажатии на кнопку Close в заголовке окна консоли или выполнять при этом какой-то опр. код (например, сообщение о том, что в данный момент этого делать не стоит)?
Здравствуйте, YourLastSong, Вы писали:
YLS>Здравствуйте, уважаемые господа.
YLS>Существует ли вообще возможность сделать так, чтобы пользователь не мог закр. программу при нажатии на кнопку Close в заголовке окна консоли или выполнять при этом какой-то опр. код (например, сообщение о том, что в данный момент этого делать не стоит)?
YLS>Заранее благодарю за возможные ответы.
в делфях на событие формы CloseQuery ставишь CanClose в значение false.
Окно не закроется.
Здравствуйте, irbis3003, Вы писали:
I>Здравствуйте, YourLastSong, Вы писали:
YLS>>Здравствуйте, уважаемые господа.
YLS>>Существует ли вообще возможность сделать так, чтобы пользователь не мог закр. программу при нажатии на кнопку Close в заголовке окна консоли или выполнять при этом какой-то опр. код (например, сообщение о том, что в данный момент этого делать не стоит)?
YLS>>Заранее благодарю за возможные ответы.
I>в делфях на событие формы CloseQuery ставишь CanClose в значение false. I>Окно не закроется.
Здравствуйте, YourLastSong, Вы писали:
YLS>Здравствуйте, уважаемые господа.
YLS>Существует ли вообще возможность сделать так, чтобы пользователь не мог закр. программу при нажатии на кнопку Close в заголовке окна консоли или выполнять при этом какой-то опр. код (например, сообщение о том, что в данный момент этого делать не стоит)?
YLS>Заранее благодарю за возможные ответы.
В С# это можно сделать следующим кодом. В C, C++ это сделать
еще проще, так как в коде используется только WinAPI
public static class NativeMethods
{
[DllImport("user32.dll")]
static extern IntPtr GetSystemMenu(IntPtr hWnd, [MarshalAs(UnmanagedType.Bool)] bool bRevert);
[DllImport("user32.dll")]
static extern int GetMenuItemCount(IntPtr hMenu);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool DrawMenuBar(IntPtr hWnd);
[DllImport("user32.dll")]
[return : MarshalAs(UnmanagedType.Bool)]
static extern bool RemoveMenu(IntPtr hMenu, uint uPosition, uint uFlags);
private const Int32 MF_BYPOSITION = 0x400;
private const Int32 MF_REMOVE = 0x1000;
public static void RemoveCloseButton()
{
IntPtr hWin = Process.GetCurrentProcess().MainWindowHandle;
if (hWin != IntPtr.Zero)
{
IntPtr hMenu = GetSystemMenu(hWin, false);
if (hMenu != IntPtr.Zero)
{
int n = GetMenuItemCount(hMenu);
int max = 20;
while (n > 0 && max > 0)
{
RemoveMenu(hMenu, (uint)(n - 1), MF_BYPOSITION | MF_REMOVE);
n = GetMenuItemCount(hMenu);
--max;
}
DrawMenuBar(hWin);
}
}
}
}
Здравствуйте, YourLastSong, Вы писали:
YLS>Существует ли вообще возможность сделать так, чтобы пользователь не мог закр. программу при нажатии на кнопку Close в заголовке окна консоли или выполнять при этом какой-то опр. код (например, сообщение о том, что в данный момент этого делать не стоит)?
То, что вы хотите, нельзя делать по морально-этическим принципам.
Здравствуйте, YourLastSong, Вы писали: YLS>А как лучше всего вернуть данную кнопку обратно? YLS>SetMenu? YLS>EnableMenuItem?
Вам уже ответили правильным посылом. SetConsoleCtrlHandler
Не нужно удалять кнопку, достаточно обработать её нажатие. А то в консоли еще и Ctrl+C/Ctrl+Break есть, которые могут закрыть приложение без нажатия на крестик.
После того, как на экране появится MessageBox, программа практически сразу же завершится в любом случае, независимо от того, была ли нажата кнопка или нет.
Здравствуйте, Centaur, Вы писали:
YLS>>Существует ли вообще возможность сделать так, чтобы пользователь не мог закр. программу при нажатии на кнопку Close в заголовке окна консоли или выполнять при этом какой-то опр. код (например, сообщение о том, что в данный момент этого делать не стоит)?
C>То, что вы хотите, нельзя делать по морально-этическим принципам.
Если юзер важнее программы то нельзя, а если наоборот то можно.
GIV>Если юзер важнее программы то нельзя, а если наоборот то можно
Каким образом?
Просто если в опр. момент прервать работу программы, то при следующем её откр. данные будут совершенно не те, что хотелось бы, вот я и хочу уточнять у пользователя, хочет ли он всё же выйти или нет.
Здравствуйте, YourLastSong, Вы писали:
GIV>>Если юзер важнее программы то нельзя, а если наоборот то можно
YLS>Каким образом?
YLS>Просто если в опр. момент прервать работу программы, то при следующем её откр. данные будут совершенно не те, что хотелось бы, вот я и хочу уточнять у пользователя, хочет ли он всё же выйти или нет.
Здравствуйте, YourLastSong, Вы писали:
YLS>Просто если в опр. момент прервать работу программы, то при следующем её откр. данные будут совершенно не те, что хотелось бы, вот я и хочу уточнять у пользователя, хочет ли он всё же выйти или нет.
Значит, нужно программу организовать так, чтобы её аварийное завершение не портило данные пользователя. Потому что, если вы переспросите пользователя, хочет ли он выйти, он скажет «да, б#@, вы что, меня за идиота держите?». А если вы отберёте у пользователя кнопку закрытия, он вытащит из кармана Task Manager.