I would like to change the content of a dropdown list when a user presses a refresh button or opens the list. I checked the WinMessages.nsh but I couldnt find anything that could change them.
So how do I change it?
Change DropDown listitems
7 posts
This is possible (I think) but I'm unfamiliar on the way to do it.
It's a new method which I've never used.
Sorry that I can't help you, but I'm sure somebody else can help you.
-Stu
It's a new method which I've never used.
Sorry that I can't help you, but I'm sure somebody else can help you.
-Stu
You can read the InstallOptions or InstallOptionsEx documentations for the "NOTIFY" flag (InstallOptions) or "Notify" INI value name (InstallOptionsEx).
Could you explain what do you want to change on a DropList control? Maybe I can give you some codes based on what you say...
opens the listOnly IOEx has a notification for this.
Could you explain what do you want to change on a DropList control? Maybe I can give you some codes based on what you say...
Well the dropdown shows the available cdrom drives and the label of the disk that's currently in it, and it would be nice to be able to refresh the labels if a user puts in a new cd.
1) (INI File) You need to use the flag "NOTIFY" for the Button control (InstallOptions) or use "Notify" INI value name with value "ONCLICK" for the Button control and "ONLISTOPEN" for the DropList control (InstallOptionsEx).
2) You need a Leave Function for your custom page so the notifications can work correctly.
3) Instead of showing the page normally, reserve it first, pop the result of the reservation (page handle) and then show the page.
4) To get a control handle by knowing the ID, use the following code:[code]!define IOGetDlgItem '!insertmacro IOGetDlgItem'
!macro IOGetDlgItem Var PageHWND FieldNumber
StrCpy '${Var}' '${FieldNumber}'
IntOp '${Var}' '${Var}' + 1199
GetDlgItem '${Var}' '${PageHWND}' '${Var}'
!macroend[/quote]To use it:
6)... I'm working on the code right now.
2) You need a Leave Function for your custom page so the notifications can work correctly.
3) Instead of showing the page normally, reserve it first, pop the result of the reservation (page handle) and then show the page.
4) To get a control handle by knowing the ID, use the following code:[code]!define IOGetDlgItem '!insertmacro IOGetDlgItem'
!macro IOGetDlgItem Var PageHWND FieldNumber
StrCpy '${Var}' '${FieldNumber}'
IntOp '${Var}' '${Var}' + 1199
GetDlgItem '${Var}' '${PageHWND}' '${Var}'
!macroend[/quote]To use it:
${IOGetDlgItem} $Var $PageHandleVar FieldNumberExample:${IOGetDlgItem} $0 $PH 2; "Field 2"5) After, you can use SendMessage with NSIS or System plugin to the control so you can do wharever you want to the control at run-time.6)... I'm working on the code right now.
6) Done! You need Detect Drives function in order to use the code below:
(Needs adaption to your code - Not totally tested)
EDIT #2: Fixed no default selection when no items are selected
(Needs adaption to your code - Not totally tested)
EDIT #1: Fixed no selection when refreshing list!define MAX_PATH 260
!define CB_ERR -1
!define CB_ADDSTRING 0x0143
!define CB_RESETCONTENT 0x014B
!define CB_SETCURSEL 0x014E
Function YourCustomPageLeave
;...Some code...
;TODO: Detect if the control you want was notified, then execute code below
# $0 = Control handle (use GetDlgItem to get this)
Push $1
System::Call `user32::SendMessageA(i r0,i ${CB_GETCURSEL},,)i .r1`
StrCmp $1 ${CB_ERR} 0 +2
StrCpy $1 0
System::Call `user32::SendMessageA(i r0,i ${CB_RESETCONTENT},,)i`
Push "CDROM Drives"
Push $0
GetFunctionAddress $0 "DetectCDROMDrives"
Exch $0
Call DetectDrives
System::Call `user32::SendMessageA(i r0,i ${CB_SETCURSEL},i r1,)i`
Pop $1
;...Some other code...
FunctionEnd
Function DetectCDROMDrives
Push $R1
System::Call `Kernel32::GetVolumeInformation(t R0,t .R1,i ${MAX_PATH},,,,,)i`
StrCpy $R0 $R0 2
System::Call `user32::SendMessageA(i r0,i ${CB_ADDSTRING},,t "$R1 ($R0)")i`
Pop $R1
Push "Go"
FunctionEnd
EDIT #2: Fixed no default selection when no items are selected
hm thanx a lot for your code, but I had the drive detection already working, just the dropdown updating at runtime was the problem. School now 🙁 I'll try this tonight.