Вопрос такой — любите ли вы делать диалоги типа "О программе"?
Как обходитесь?
Сделали один раз и таскаете из проекта в проект?
Каким требованиям должен соответствовать такой диалог?
Здравствуйте, Marty, Вы писали:
M>Вопрос такой — любите ли вы делать диалоги типа "О программе"?
Просто обожаю Я серьезно. В About окно одной из программ я запихал пасхалку. Это дает мне повод периодически на форумах создавать темы вида "В честь нового года первым 10 нашедшим пасхальное яйцо приз — бесплатная лицензия". Это некое подобие PR.
Здравствуйте, Brice Tribbiani, Вы писали:
BT>Заинтриговал BT>Расскажи, что-ли о себе — как ты любишь делать такие диалоги, продемонстрируй свою коллекцию
Сам такие утилитарные диалоги делать просто ненавижу
Я тут сначала для себя кой-какой пак делал, а потом решил сделать его на продажу, коллегам шароварщикам .
В том числе туда входит и гибко настраиваемый диалог About, с картинками, ссылками, копирайтами, красивыми шрифтами и прочим блекджекомб, правда только Win32, зато никаких зависимостей, весь пак кил 150 весит.
BT>У меня обычный QMessageBox с названием сайта в качестве копирайта.
А Ctrl+C (Ctrl+Ins) поддерживается?
Чтобы скопировать всю инфу о программе, например, при обращении в саппорт?
Здравствуйте, Aniskin, Вы писали: A>Здравствуйте, Marty, Вы писали: M>>Вопрос такой — любите ли вы делать диалоги типа "О программе"? A>Просто обожаю Я серьезно. В About окно одной из программ я запихал пасхалку. Это дает мне повод периодически на форумах создавать темы вида "В честь нового года первым 10 нашедшим пасхальное яйцо приз — бесплатная лицензия". Это некое подобие PR.
Пасхалку тоже предусмотрел.
Скрытый текст
Можно задать обработчик клика по картинке, проверить там Ctrl/Alt/Shift и показать пасхалку.
А вообще, прототип функции диалога так выглядит:
#define VMPIK_ABOUT_CLOSE_BUTTON 0x00000001 /* Use 'Close' button instead of 'Ok' */
/* Default Ok/Close button position is bottom-right */#define VMPIK_ABOUT_BUTTON_WITH_IMAGE 0x00000010 /* Place Ok/Close button below the image */#define VMPIK_ABOUT_BUTTON_AT_LEFT 0x00000020
#define VMPIK_ABOUT_BUTTON_AT_CENTER 0x00000040
#define VMPIK_ABOUT_IMAGE_BITMAP 0x00000100 /* Default - icon (HICON) */#define VMPIK_ABOUT_IMAGE_EMF 0x00000200 /* Default - icon (HICON) */#define VMPIK_ABOUT_IMAGE_AT_LEFT 0x00000400 /* Default - at right */#define VMPIK_ABOUT_PREPEND_COPYRIGHT_SIGN 0x00001000
#define VMPIK_ABOUT_COMPOSITE_COPYRIGHT_SIGN 0x00002000 /* In ANSI version, if this flag is set, the "(c)" string is used instead of single copyright sign */#define VMPIK_ABOUT_COPYRIGHT_APPEND_ALL_RIGHTS 0x00004000 /* Append 'All reights reserved' to copyright string. Comma and space are automatically appended */#define VMPIK_ABOUT_SYS_INFO_WINDOWS_INFO 0x00010000
#define VMPIK_ABOUT_SYS_INFO_MEM_INFO 0x00020000
#define VMPIK_ABOUT_SYS_INFO_CPU_INFO 0x00040000
#define VMPIK_ABOUT_DISABLE_CLIPBOARD_COPY 0x00080000 /* Don't copy information to clipboard when Ctrl+C (Ctrl+Ins) pressed */#define VMPIK_ABOUT_ALWAYS_SHOW_REGISTERED 0x00100000 /* Show 'Registered version' even if lpcRegisteredToNameString, lpcRegisteredToEmailString and lpcRegistrationExpiresDateString are 0 */#define VMPIK_ABOUT_CLOSE_ON_URL_EVENT 0x00200000 /* Close dialog when URL link labek clicked */
INT
VMPIK_AboutAppDlg( HWND hWndParent
, LPCTSTR lpcDlgTitle
, const VMPIK_ABOUTDLG_FONTS_INFO *lpcLabelsFonts
, UINT horScale /* If labels text doesn't fit to labels, or automaticaly calculated labels width is too long or too short, set this scale to value <100 to reduce width or >100 to enlarge width. Default value is 0 (keep size untouched) */
, HICON hIcon /* Set dialog icon. Use LoadImage with GetSystemMetrics(SM_CXICON)*/
, HICON hIconSmall /* Set dialog small icon. Use LoadImage with GetSystemMetrics(SM_CXSMICON) */
, HANDLE hAppImage
, POINT *pLeftTop /* In/Out position of left top corner of dialog, set pounter to 0 or p->x=-1 and p->y=-1 to center dialog */
, DWORD aboutFlags
/*--------------------------*/
, LPCTSTR lpcAppName
, LPCTSTR lpcAppNameSubtitle
, LPCTSTR lpcAppInfoString
, LPCTSTR lpcAppVersionString
/*--------------------------*/
, LPCTSTR lpcAppCopyrightString
, LPCTSTR lpcAppUrlString
/*--------------------------*/
, BOOL bTrial
, LPCTSTR lpcRegisteredToNameString
, LPCTSTR lpcRegisteredToEmailString
, LPCTSTR lpcRegistrationExpiresDateString
/*--------------------------*/
, LPCTSTR lpcAdditionalInfoText
, LPCTSTR lpcAdditionalInfoTextTitle
/*--------------------------*/
, PFN_VMPIK_AboutBoxImageClickCallback pfnImageClickCallback
, LPVOID lpvImageClickCallbackParam
);
Здравствуйте, Marty, Вы писали:
M>Сам такие утилитарные диалоги делать просто ненавижу
M>Я тут сначала для себя кой-какой пак делал, а потом решил сделать его на продажу, коллегам шароварщикам . M>В том числе туда входит и гибко настраиваемый диалог About, с картинками, ссылками, копирайтами, красивыми шрифтами и прочим блекджекомб, правда только Win32, зато никаких зависимостей, весь пак кил 150 весит.
Без шансов Хотя нарисовал нормально.
BT>>У меня обычный QMessageBox с названием сайта в качестве копирайта. M>А Ctrl+C (Ctrl+Ins) поддерживается? M>Чтобы скопировать всю инфу о программе, например, при обращении в саппорт?
Проверил — оказывается поддерживается На венде по крайней мере, мак лень запускать.
хотел уже на боковую
папаху снял и сапоги
но в комментариях проснулись
враги
Здравствуйте, Brice Tribbiani, Вы писали: M>>Я тут сначала для себя кой-какой пак делал, а потом решил сделать его на продажу, коллегам шароварщикам . M>>В том числе туда входит и гибко настраиваемый диалог About, с картинками, ссылками, копирайтами, красивыми шрифтами и прочим блекджекомб, правда только Win32, зато никаких зависимостей, весь пак кил 150 весит. BT>Без шансов Хотя нарисовал нормально.
Ну, в паке основная фишка в сглаживании проблем установки и интеграции x86/x64 приложений, интеграция с VMProtect Ultimate+Web License Manager, Гуй для различных вариантов активации (причем VMProtect вообщем-то не обязательно Ultimate+Web License Manager, VMProtect в принципе откручивается без проблем ), скрипты для интеграции с InnoSetup — ввод серийника/активация на этапе инсталляции программы (в перспективе думаю и с другими инсталеррами разобраться). Пока вроде все. А About чисто бонусом идет
Вот, к примеру, нейтральные от протектора хелперы (к слову, думаю, кто-то и не знал о каких-то нюансах):
Скрытый текст
/* Helper function */
/* Next functions return exact FALSE, TRUE, or (BOOL)-1 for N/A state */
BOOL VMPIKAPI VMPIK_IsUserInAdminGroup();
BOOL VMPIKAPI VMPIK_IsRunAsAdmin();
BOOL VMPIKAPI VMPIK_IsProcessElevated();
BOOL VMPIKAPI VMPIK_GetVirtualizationStatus();
/* if vst==(BOOL)-1 nothing to be done
return TRUE if done, FALSE if failed - not a prev virtualization status
*/
BOOL VMPIKAPI VMPIK_SetVirtualizationStatus(BOOL vst);
/* return VMPIK_SECURITY_MANDATORY_* value */
DWORD VMPIKAPI VMPIK_GetProcessIntegrityLevel();
DWORD VMPIKAPI VMPIK_GetWindowsVersion( DWORD *pMinorVersion /* optional */ ); /* return 0 if fail or windows major version number */
BOOL VMPIKAPI VMPIK_IsWindowsXp(); /* or later Windows */
BOOL VMPIKAPI VMPIK_IsWindowsVista(); /* or later Windows */
BOOL VMPIKAPI VMPIK_IsWindows64(); /* return TRUE if current app is 32/64 bits app is running on 64 bit Windows */
VOID VMPIKAPI VMPIK_GetSystemInfo(LPSYSTEM_INFO lpSystemInfo);
/* Return FALSE if run elevated failed or process allready has elevation level same as bElevated (if lpExeName is 0)
lpParams can be 0
if lpExeName is 0, current executable will be started
*/
BOOL VMPIKAPI VMPIK_RunElevatedA( HWND hWnd, BOOL bElevated, LPCSTR lpcExeName, LPCSTR lpcParams, LPCSTR lpcDirectory);
BOOL VMPIKAPI VMPIK_RunElevatedW( HWND hWnd, BOOL bElevated, LPCWSTR lpcExeName, LPCWSTR lpcParams, LPCWSTR lpcDirectory);
/* Automaticaly uses classic or 'Vista' file dialogs
NOTE: lpszFilenameBuf must be initialized by zero in lpszFilenameBuf[0] or must contain file name used to initialize dialog.
If pFilterIndex taken and function returns TRUE, *pFilterIndex contains index of selected filter, 1 - first filter, 2 - second, and so on;
*pFilterIndex contains 0 if there is no selected filter at all.
*/
BOOL VMPIKAPI VMPIK_OpenFileDialogA( HWND hWndParent, DWORD osfdFlags, LPCSTR lpszDialogTitle, LPCSTR lpszDefExt, LPCSTR lpszFilter, LPCSTR lpszInitialDir, LPSTR lpszFilenameBuf, DWORD dwBufSize, /*out*/ DWORD *pFilterIndex );
BOOL VMPIKAPI VMPIK_OpenFileDialogW( HWND hWndParent, DWORD osfdFlags, LPCWSTR lpszDialogTitle, LPCWSTR lpszDefExt, LPCWSTR lpszFilter, LPCWSTR lpszInitialDir, LPWSTR lpszFilenameBuf, DWORD dwBufSize, /*out*/ DWORD *pFilterIndex );
BOOL VMPIKAPI VMPIK_SaveFileDialogA( HWND hWndParent, DWORD osfdFlags, LPCSTR lpszDialogTitle, LPCSTR lpszDefExt, LPCSTR lpszFilter, LPCSTR lpszInitialDir, LPSTR lpszFilenameBuf, DWORD dwBufSize, /*out*/ DWORD *pFilterIndex );
BOOL VMPIKAPI VMPIK_SaveFileDialogW( HWND hWndParent, DWORD osfdFlags, LPCWSTR lpszDialogTitle, LPCWSTR lpszDefExt, LPCWSTR lpszFilter, LPCWSTR lpszInitialDir, LPWSTR lpszFilenameBuf, DWORD dwBufSize, /*out*/ DWORD *pFilterIndex );
BOOL VMPIKAPI VMPIK_SetThreadLocaleAndUiLang( WORD langid );
/* lpszLangId can be in form lang-COUNTRY, lang_COUNTRY or langCOUNTRY: enuUS, en_US, enUS */
WORD VMPIKAPI VMPIK_GetLangIdByStringA( LPCSTR lpszLangId );
WORD VMPIKAPI VMPIK_GetLangIdByStringW( LPCWSTR lpszLangId);
BOOL VMPIKAPI VMPIK_SetThreadLocaleAndUiLangByLangNameA( LPCSTR lpszLangId );
BOOL VMPIKAPI VMPIK_SetThreadLocaleAndUiLangByLangNameW( LPCWSTR lpszLangId );
/* Parse serial number format into pSerialNumberNumChars (array of 16 UINTs at least)
strFormat can be in form N-M-K-L - N, M, K, L - integers
or ####-####-####-####
or mixed such N-####-K-L
Symbol '-' in format string means sepChar
sepChar - of 0 taken, '-' will be used
Return: number of successfully parsed parts, number of total found parts will be placed to pNumPartsFound (if taken)
*/
UINT VMPIKAPI VMPIK_ParseSerialNumberFormatA( LPCSTR strFormat, CHAR sepChar, UINT *pSerialNumberNumChars, UINT *pNumPartsFound);
UINT VMPIKAPI VMPIK_ParseSerialNumberFormatW( LPCWSTR strFormat, WCHAR sepChar, UINT *pSerialNumberNumChars, UINT *pNumPartsFound);
Протектор-нейтральные функции чтения/записи данных активации
Скрытый текст
/* Return 0 if ok
VMPIK_ACTIVATION_SMALL_BUFFER - if buffer is not enough size
VMPIK_ACTIVATION_NO_CONNECTION - if failed to read/write file or registry; try GetLastError to get WIN API error code
*/
/* hRootKey - put 0 if file used, HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER for registry
if file used and lpcRegValOrFileName is 0, lpcRegOrFilePath must contain file name
*/
INT VMPIKAPI VMPIK_ActivationCodeReadA ( DWORD acfFlags, HKEY hRootKey, LPCSTR lpcRegOrFilePath, LPCSTR lpcRegValOrFileName, LPSTR lpActivationCodeBuf, UINT ActivationCodeBufSize );
INT VMPIKAPI VMPIK_ActivationCodeReadW ( DWORD acfFlags, HKEY hRootKey, LPCWSTR lpcRegOrFilePath, LPCWSTR lpcRegValOrFileName, LPSTR lpActivationCodeBuf, UINT ActivationCodeBufSize );
INT VMPIKAPI VMPIK_ActivationCodeWriteA ( DWORD acfFlags, HKEY hRootKey, LPCSTR lpcRegOrFilePath, LPCSTR lpcRegValOrFileName, LPCSTR lpcActivationCode );
INT VMPIKAPI VMPIK_ActivationCodeWriteW ( DWORD acfFlags, HKEY hRootKey, LPCWSTR lpcRegOrFilePath, LPCWSTR lpcRegValOrFileName, LPCSTR lpcActivationCode );
BOOL VMPIKAPI VMPIK_ActivationCodeTestIsWritableA( DWORD acfFlags, HKEY hRootKey, LPCSTR lpcRegOrFilePath );
BOOL VMPIKAPI VMPIK_ActivationCodeTestIsWritableW( DWORD acfFlags, HKEY hRootKey, LPCWSTR lpcRegOrFilePath );
INT VMPIKAPI VMPIK_ActivationCodeRemoveA ( DWORD acfFlags, HKEY hRootKey, LPCSTR lpcRegOrFilePath, LPCSTR lpcRegValOrFileName );
INT VMPIKAPI VMPIK_ActivationCodeRemoveW ( DWORD acfFlags, HKEY hRootKey, LPCWSTR lpcRegOrFilePath, LPCWSTR lpcRegValOrFileName );
BOOL VMPIKAPI VMPIK_ActivationCodeIsStoredOnComputerA( DWORD acfFlags, HKEY hRootKey, LPCSTR lpcRegOrFilePath, LPCSTR lpcRegValOrFileName );
BOOL VMPIKAPI VMPIK_ActivationCodeIsStoredOnComputerW( DWORD acfFlags, HKEY hRootKey, LPCWSTR lpcRegOrFilePath, LPCWSTR lpcRegValOrFileName );
/* Return TRUE if success, FALSE overwise
if bTrialState==(BOOL)-1 then trial state will be cleared and further reading will returns 'Undefined' trial state
*/
BOOL VMPIKAPI VMPIK_ActivationWriteTrialStateA(DWORD acfFlags, HKEY hRootKey, LPCSTR lpcRegOrFilePath, LPCSTR lpcRegValOrFileName, BOOL bTrialState );
BOOL VMPIKAPI VMPIK_ActivationWriteTrialStateW(DWORD acfFlags, HKEY hRootKey, LPCWSTR lpcRegOrFilePath, LPCWSTR lpcRegValOrFileName, BOOL bTrialState );
/* Return TRUE if trial mode is on, FALSE - trial mode off (full version used), (BOOL)-1 if no information
Do not forget to save trial state information from setup programm if app activated using the trial serial during setup process
*/
BOOL VMPIKAPI VMPIK_ActivationReadTrialStateA(DWORD acfFlags, HKEY hRootKey, LPCSTR lpcRegOrFilePath, LPCSTR lpcRegValOrFileName );
BOOL VMPIKAPI VMPIK_ActivationReadTrialStateW(DWORD acfFlags, HKEY hRootKey, LPCWSTR lpcRegOrFilePath, LPCWSTR lpcRegValOrFileName );
BT>>>У меня обычный QMessageBox с названием сайта в качестве копирайта. M>>А Ctrl+C (Ctrl+Ins) поддерживается? M>>Чтобы скопировать всю инфу о программе, например, при обращении в саппорт? BT>Проверил — оказывается поддерживается На венде по крайней мере, мак лень запускать.
Хм, прикольно, но это Qt надо таскать, это хорошо, когда аппа на Qt и написана. А мое и из дельфей можно вызывать, и таскать ничего не надо. Ну и некоторая информация о системе собирается без лишних телодвижений. Вот пример, по Ctrl+C в приведенном диалоге в буфере появится такое:
About VMPIK Demo
----------------------------------------
VMPIK Demo App
VMProtect Integration Kit Demo application
Demonstrates the basic features of the VMPIK.
Version: 1.0 alpha
(c) 2013 PureFractalSolutions. All rights reserved.
http://vmpkit.com
----------------------------------------
Trial version
Registered to: Tester (test@vmpkit.com)
Expires: 12/24/2016
----------------------------------------
Microsoft Windows 6.1/x64, build 7601, Service Pack 1
CPU: 4 X x64
Memory: 8155Mb, used: 68%
----------------------------------------
Думаю, те, кто прикупил VMProtect Ultimate+Web License Manager, заглянут и ко мне. Хотя, спорить не буду, все вообщем-то довольно просто, гугл, медитация и пара недель времени позволяют обойтись и без моего пака
Здравствуйте, Brice Tribbiani, Вы писали: M>>Я тут сначала для себя кой-какой пак делал, а потом решил сделать его на продажу, коллегам шароварщикам . M>>В том числе туда входит и гибко настраиваемый диалог About, с картинками, ссылками, копирайтами, красивыми шрифтами и прочим блекджекомб, правда только Win32, зато никаких зависимостей, весь пак кил 150 весит. BT>Без шансов Хотя нарисовал нормально.
Ну, попробовать все равно стоило. Все равно для себя делал почти все то же
(Хотя что я вру, для универсальности пришлось потрудится побольше )
А вот для примера тот же диалог, просто пару битов во флагах по другому задал: