Simulate Standard Windows Popup message Beep sound - nsis

I would like to simulate the standard windows popup message Beep sound in order to have each popup message in my script with the same sound effect.
In my script I use the default clause MUI_ABORTWARNING so, when the relative popup message is displayed, the standard windows popup message Beep is played.
For my purpose, I tryed to use the following API call but the sound effect is very different
System::Call "kernel32::Beep(i, i) b (${BEEP_FREQ_HZ}, ${BEEP_DURATION_MSEC})"
How can I do to accomplish the task?
Many thanks in advance to everyone that can help me on this.
Regards,

kernel32::Beep tries to use the little hardware speaker in your machine, if not available it uses the default system sound.
Use MessageBeep to generate a standard sound:
!define /IfNDef MB_ICONWARNING 0x00000030 ; You might want MB_ICONINFORMATION or MB_ICONSTOP instead
System::Call 'USER32::MessageBeep(i ${MB_ICONWARNING})'
If you are actually calling MessageBox in your NSIS code then you don't need to call MessageBeep, MessageBeep will be called for you if you use one of the MB_ICON* flags.

Related

NSIS: How to remove/hide MUI_LICENSEPAGE_TEXT_BOTTOM?

Hello to you who is reading this post. About a week ago I discovered NSIS and have just about managed to finish my first installer script. I managed to find answers to pretty much all of my questions through web searches, and have managed to create a pretty elaborate installer. There is one issue I can't figure out, as everything I have tried does not work and I can't find a solution online that I understand or is specific enough to be applied to this issue.
I'm using the modern UI "MUI2". I found some code to increase the size of the rich textbox on the license page which works great, but now the text at the bottom of the window (MUI_LICENSEPAGE_TEXT_BOTTOM) overlaps it and causes some visual bugs. Setting it to an empty string does not work and setting it to a single space does not work. I managed to get it to disappear with "FindWindow" and "GetDlgItem", but I'm not exactly a programmer so I don't have the intelligence or knowledge on how to set these up correctly. What I did manage to pull off, it also removed the rich textbox, and after several hours of defeat I finally gave up and turned to the internet.
It's kind of mind blowing to me that NSIS does not provide a simple way to remove controls. I don't want the "text bottom" label there at all, I want it gone or at the very least hidden. I know the handle I'm trying to remove is "1006" because I opened up the installer in Resource Hacker and removed the label from there. What bugs the me most is that actually worked perfectly and removes the label, but it also corrupts the installer and I have to use NCRC on command line to launch it. So scratch that as a workable solution...
TL;DR my question is: how do I hide or get rid of MUI_LICENSEPAGE_TEXT_BOTTOM?
MUI2 already has a variable you can use:
!include MUI2.nsh
!define MUI_PAGE_CUSTOMFUNCTION_SHOW HideMui2Text
!insertmacro MUI_PAGE_LICENSE
!insertmacro MUI_LANGUAGE "English"
Function HideMui2Text
ShowWindow $mui.LicensePage.Text 0
FunctionEnd
If you wanted to do it manually it would be
FindWindow $0 "#32770" "" $HWNDPARENT ; Find inner page
GetDlgItem $1 $0 1006 ; Find control
ShowWindow $1 0
When using Resource Hacker you need to copy the base file from NSIS\Contrib\UIs and in your script define MUI_UI to the path of your modified UI file.

Changing the locale of OK button in a MessageBox in InstallShield

We have a Basic MSI installer project. On a certain dialog, we do validations of data provided by user and then throw appropriate message using the MessageBox().
Now when the MessageBox comes up, it comes up with the message we want and an OK button.
We have an issue w.r.t the locale of this OK button. When tested on English, French windows 2008 machine we can get the OK button, where OK is in English. When we use the same installer on a Spanish windows machine then the same OK button comes up with OK in Spanish.
I'm not able to figure out what's the cause of this behaviour. Any hint/help would be of great help.
/Avadhut.
It's unclear from your question exactly what API you call, and in exactly what scenario. Note that for almost everyone, displaying the OK button in the "native" language of the machine will not be confusing, so only causes problems during the QA process.
The MessageBox API of Windows is localized to the same locale as Windows itself. By contrast, MessageBoxEx is documented to take a language parameter, although when I looked, a commenter said it doesn't always change the default localization. (My guess would be that the requested language was not available on the commenter's machine.)
If you're showing a message from within a MSI DLL custom action, it's better to use MsiProcessMessage than MessageBox as MsiProcessMessage will parent its window correctly. I suspect you're using a ControlEvent, which is implicitly avoided in a silent installation, but MsiProcessMessage will also not show its message during silent installations without requiring any extra work; if using MessageBox in an execute sequence action, you would have to check UILevel manually. However it's unclear from the documentation whether the buttons on an MsiProcessMessage message box will be localized.

Hiding NSIS Dialog

I am new to NSIS so bear with me:
I am using NSIS (legacy code...) for making sure that .NET is installed before launching a .NET application.
If it is not installed, I am installing it for the user, but I would prefer getting user's approval before playing hooky with his system.
I was able to display the message to the user:
using this code:
WriteIniStr $MissingItemsIniFilename 'Field 2' 'State' '$R2'
WriteIniStr $MissingItemsIniFilename 'Settings' 'CancelEnabled' 1
InstallOptions::Dialog $MissingItemsIniFilename
Pop $1 ;get button action
my problem is that after user clicks Next the "dialog" is not closing and shows:
So my question is, How can I close the dialog?
Extra information:
I am using InstallOptions for showing the dialog.
I looked into nsDialogs but could not find there a solution that worked for me (might be due to lack of experience in NSIS).
Please let me know if any other information is required...
If you want to hide the entire installer you can do:
HideWindow
ExecWait ...
BringToFront
otherwise you should probably move that ExecWait to a Section...

Run installer minimized + NotifyIcon

I have my command line options that work for my installer, which involves the plugin NotifyIcon. Because of this plugin, I can not run my installer silently through the command line. It has one custom page MUI page over. Two questions occured to me, so if anyone can help, please do so.
I'm using MUI, so I know I have to use a separate function and then define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit ! I load the code correctly and icon works for me properly.
Running the installation mínimimizado. I've dealt with "HideWindow" on . MyGuiInit OnInit and also in my own functions, and anywhere else I could think of, but that does not work very well. What I need is that the first boot installation window minimized and the icon appears on the task bar (this already works for me) and when you press the icon on the taskbar window is restored installation to continue with the installation normally.
I don't really understand your question but if you want to start the installer minimized you can do:
!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
Function myGuiInit
System::Call 'USER32::PostMessage(i$hwndparent,i0x0112,i0xF020,i0)'
FunctionEnd

nsis createting InternetShortcut not displaying icon

When I try to give custom icon while creating InternetShortcut that particulat icon is not there in created InternetShortcut. Default icon is comming.
Here is code:
WriteINIStr "$SMPROGRAMS\Launch_APP.url" "InternetShortcut" "URL" "http://localhost:9080/myapp/index.php"
WriteINIStr "$SMPROGRAMS\Launch_APP.url" "InternetShortcut" "IconFile" "$ReadmePath\A.ico"
CreateShortcut uses IShellLink to create shortcuts and is not supposed to be used to create internet shortcuts. The documented interface you are supposed to use to create internet shortcuts is IUniformResourceLocator. NSIS does not have a native instruction for this but it can be called by the system plugin using its COM syntax. To set the icon you would have to QueryInterface for IPropertySetStorage and set PID_IS_ICONFILE. In the end you are just going to end up with the same .ini file which is why a lot of examples (NSIS and other stuff) just write using the .ini API.
You could try adding IconIndex=0 to the .ini but my guess is that the icon path is wrong or icon caching is getting in the way.
Have you tried clearing the icon cache or testing on a different machine?
Thanks for using NSIS.
So - There is function CreateShortCut (nsis.sourceforge.net/Docs/Chapter4.html#4.9.3.4). it is intended to create any shortcut Windows supports. You should use it. If you find some specific case where it does not work, feel free to mail to Devs in NSIS contact list or create ticket in their bug-tracker.

Resources