» Диалог со списком окон в системе

K.A.V.
www.oszone.net
22.02.2010
Автор: K.A.V.
Последнее обновление: 17.05.2014

INI файл
; Ini file generated by the HM NIS Edit IO designer.
[Settings]
NumFields=4

[Field 1]
Type=Label
Text=Пример проекта со списком окон в системе. K.A.V.
Left=2
Right=296
Top=0
Bottom=10
FontName=Verdana
FontHeight=10
FontBold=1

[Field 2]
Type=ListView
Text=ListView
Flags=REPORT_VIEW
Left=2
Right=297
Top=13
Bottom=121

[Field 3]
Type=Button
Text=Обновить
Left=189
Right=297
Top=124
Bottom=136
NOTIFY=ONCLICK
ToolTipFlags=BALLOON
ToolTipIcon=INFORMATION
ToolTipTitle=Обновить список окон
ToolTipText=Нажмите, чтобы обновить список запущенных окон

[Field 4]
Type=Checkbox
Text=Не показывать окна без имён
Left=2
Right=178
Top=126
Bottom=134
State=1
ToolTipFlags=BALLOON
ToolTipIcon=EXCLAMATION
ToolTipTitle=Только окна с именами
ToolTipText=Если окно не имеет имени, то оно не будет отображено в этом списке

NSIS код
!define PROCESS_QUERY_INFORMATION 0x0400
!define PROCESS_VM_READ           0x0010

!include "MUI.nsh"
!include "WinMessages.nsh"
!include "nsDialogs.nsh"
!include "CommCtrl.nsh"
!include "FileFunc.nsh"

Page custom MyDialog MyDialog_Leave "" ; Функция показа диалога
!insertmacro MUI_PAGE_DIRECTORY
Page instfiles

!insertmacro MUI_LANGUAGE "Russian"

Name "InstallOptionsEx Test"
OutFile "Project.exe"


Function MyDialog
  InitPluginsDir
  File /oname=$PLUGINSDIR\Project.ini "Project.ini"

        InstallOptionsEx::initDialog /NOUNLOAD "$PLUGINSDIR\Project.ini"

  Var /global HWND
  ReadINIStr $HWND "$PLUGINSDIR\Project.ini" "Field 2" "HWND"
  SendMessage $HWND ${LVM_SETEXTENDEDLISTVIEWSTYLE} "${LVS_EX_FULLROWSELECT}" "${LVS_EX_FULLROWSELECT}"
${NSD_LV_DeleteColumn} $HWND 0
${NSD_LV_InsertColumn} $HWND "0" "" "Имя окна"
${NSD_LV_InsertColumn} $HWND "1" "" "Класс окна"
${NSD_LV_InsertColumn} $HWND "2" "" "Образ процесса"
${NSD_LV_InsertColumn} $HWND "3" "" "Путь к процессу"

SendMessage $HWND ${LVM_SETCOLUMNWIDTH} "0" "${LVSCW_AUTOSIZE_USEHEADER}"
SendMessage $HWND ${LVM_SETCOLUMNWIDTH} "1" "${LVSCW_AUTOSIZE_USEHEADER}"
SendMessage $HWND ${LVM_SETCOLUMNWIDTH} "2" "${LVSCW_AUTOSIZE_USEHEADER}"
SendMessage $HWND ${LVM_SETCOLUMNWIDTH} "3" "${LVSCW_AUTOSIZE_USEHEADER}"

        InstallOptionsEx::show
FunctionEnd


Function MyDialog_Leave
  ReadINIStr $0 "$PLUGINSDIR\Project.ini" "Settings" "State"

  StrCmp $0 0 Button_NEXT_Clicked
  StrCmp $0 3 UpdateProcessList

  abort ; прекращаем проверку, т.к. взаимодействующих элементов в нашей странички больше нет

UpdateProcessList:
 SendMessage $HWND ${WM_SETREDRAW} "0" ""
 ReadINIStr $R2 "$PLUGINSDIR\Project.ini" "Field 1" "HWND"
 ReadINIStr $R0 "$PLUGINSDIR\Project.ini" "Field 4" "State"
 UserInfo::GetName
 Pop $R1
 SendMessage $R2 ${WM_SETTEXT} "0" "STR:Идёт поиск..."
 SendMessage $HWND ${LVM_DELETEALLITEMS} 0 0
 call GetWindowsList
 SendMessage $R2 ${WM_SETTEXT} "0" "STR:Список окон обновлён!"
 SendMessage $HWND ${LVM_SETCOLUMNWIDTH} "3" "${LVSCW_AUTOSIZE}"
 SendMessage $HWND ${WM_SETREDRAW} "1" ""
abort

Button_NEXT_Clicked:
FunctionEnd



Function GetWindowsList
FindWindow $0 "" ""
 System::Call "user32::GetWindowText(ir0,t.r2)"
 System::Call "user32::GetClassName(ir0,t.r3)"
st:
FindWindow $0 "" "" "" $0
 StrCmp $0 "0" end 0
 System::Call "user32::GetWindowText(ir0,t.r2)"
 System::Call "user32::GetClassName(ir0,t.r3)"
StrCmp $R0 "0" +2 0
StrCmp $2 "" st 0
 System::Call 'user32::GetWindowThreadProcessId(ir0, *l.r1)'
 System::Call 'kernel32::OpenProcess(i${PROCESS_QUERY_INFORMATION}|${PROCESS_VM_READ}, i0, ir1)i.r1'
 System::Call 'psapi::GetModuleFileNameExA(ir1, i0, t.r1, i260)'
${GetFileName} "$1" $4
  SendMessage $HWND ${LVM_GETITEMCOUNT} "" "" $R8
  ${NSD_LV_InsertItem} $HWND  "$R8" "$2"
  ${NSD_LV_SetItemText} $HWND "$R8" "1" "$3"
  ${NSD_LV_SetItemText} $HWND "$R8" "2" "$4"
  ${NSD_LV_SetItemText} $HWND "$R8" "3" "$1"
goto st
end:
FunctionEnd




Section -post
SetAutoClose true
SectionEnd