Как обновить все иконки в трее.

Тема в разделе "WASM.BEGINNERS", создана пользователем _sheva740, 14 сен 2011.

  1. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Добрый день.

    Помогите разобраться !!!!

    Сторонняя прожка соединяется с ftp сервером и тянет там что-то, не суть ...
    Если сетка подгружена прожка подвисает на долго.
    Просьбы к разработчикам "устранить траблу"- не увенчались успехом.
    Выход простой - перегрузить прогу и делов-то.
    Прожка бросает иконку в трей.
    Решение - под XPSP3 процесс убивается (TerminateProcess())
    и прога (ShellExecute())стартует снова,
    Но иконка в трее от старого процесса не уходит :dntknw:
    Хотя если мышкой поводить - пропадет.

    Пытаюсь найти трей и отослать ему сообщение - не помогает.
    Вопрос - как обновить иконки в трее под XP?

    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. include \masm32\include\windows.inc
    5. include \masm32\include\user32.inc
    6. include \masm32\include\kernel32.inc
    7. include \masm32\include\shell32.inc
    8. include \masm32\include\advapi32.inc
    9.  
    10. includelib \masm32\lib\user32.lib
    11. includelib \masm32\lib\shell32.lib
    12. includelib \masm32\lib\kernel32.lib
    13. includelib \masm32\lib\advapi32.lib
    14.  
    15. .data
    16.     ini_file_conf   db 1024 dup (0)
    17.     szSection       db "termsets",0
    18.     szKey_1     db "term_path",0
    19.     szKey_2     db "term_name",0
    20.  
    21.     str_path        db 100 dup(0)
    22.     size_str_path   =$-str_path
    23.  
    24.     str_name        db 100 dup(0)
    25.     size_str_name   =$-str_name
    26.     szNULL      db 0
    27.  
    28.     class1      db 'Shell_TrayWnd',0    ; Название класса окна трея
    29.     class2      db 'TrayNotifyWnd',0    ; Название класса панели уведомлений
    30.     class3      db 'SysPager',0     ; Трей
    31.     class4      db 'ToolbarWindow32',0  ; Панель с иконками
    32.  
    33.     errors      db ':(((',0
    34. .data?
    35.     hSnapshot       HANDLE ?
    36.     ProcEnt     PROCESSENTRY32 <?>
    37. .code
    38.  
    39. start:
    40.     push    offset ini_file_conf         ; директорию
    41.     push    2048             ; файла
    42.     call    GetCurrentDirectory      ;
    43.  
    44.     mov dword ptr [ini_file_conf+eax+0],'ret\'   ; Добавим к буферу  \pop3set.ini
    45.     mov dword ptr [ini_file_conf+eax+4],'tesm'   ; имя инишки    
    46.     mov dword ptr [ini_file_conf+eax+8],'ini.'   ;
    47.     mov byte  ptr [ini_file_conf+eax+12],0 
    48.     ; ----------------------------------
    49.     ; Переносим данные из ini - файла в строки
    50.  
    51.     invoke  RtlZeroMemory, addr str_path, size_str_path
    52.     invoke  GetPrivateProfileString, addr szSection, addr szKey_1,\
    53.                  addr szNULL, addr str_path,\
    54.                  size_str_path, addr ini_file_conf
    55.  
    56.     invoke  GetPrivateProfileString, addr szSection, addr szKey_2,\
    57.                  addr szNULL, addr str_name,\
    58.                  size_str_name, addr ini_file_conf
    59.  
    60.  
    61.  
    62.  
    63.     invoke  CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS,0
    64.     .IF (eax != INVALID_HANDLE_VALUE)
    65.         mov hSnapshot,eax
    66.         mov [ProcEnt.dwSize],SIZEOF ProcEnt
    67.         invoke Process32First, hSnapshot,ADDR ProcEnt
    68.         .IF (eax)
    69.             @@:
    70.             invoke lstrcmpi, ADDR str_name ,ADDR [ProcEnt.szExeFile]
    71.             .IF (eax == 0)
    72.                 invoke OpenProcess, PROCESS_TERMINATE,FALSE,[ProcEnt.th32ProcessID]
    73.                 .IF (eax)
    74.                     invoke TerminateProcess, eax,0
    75.                 .ELSE
    76.                 .ENDIF
    77.             .ENDIF
    78.             invoke Process32Next, hSnapshot,ADDR ProcEnt
    79.             test eax,eax
    80.             jnz @B
    81.         .ENDIF
    82.     .ENDIF
    83.  
    84.     invoke  CloseHandle, hSnapshot
    85.  
    86.     invoke  Sleep,1000
    87.  
    88.     ; Найти окно трея
    89.     invoke  FindWindow,offset class1,NULL
    90.     or      eax,eax
    91.     jz      __exit_process
    92.     ; Найти панель уведомлений
    93.     invoke  FindWindowEx,eax,NULL,offset class2,NULL
    94.     or      eax,eax
    95.     jz      __exit_process
    96.     ; Найти трей
    97.     invoke  FindWindowEx,eax,NULL,offset class3,NULL
    98.     or      eax,eax
    99.     jz      __exit_process
    100.     ; Найти панель иконок в трее
    101.     invoke  FindWindowEx,eax,NULL,offset class4,NULL
    102.     or      eax,eax
    103.     jz      __exit_process
    104.  
    105.     invoke  SendMessage, eax, WM_NOTIFY, NULL, NULL               ;//????
    106. __exit:
    107.     invoke  ExitProcess,0
    108.  
    109. __exit_process:
    110.     invoke  MessageBoxA,NULL,addr errors, NULL, NULL
    111.     jmp __exit
    112. END start
    Тестирую на проге из Ишелиона урока 23 - trayicon.exe
    Да для тестов нужно ini -шку termset.ini подправить, путь изменить.

    Помогите разобраться !!!!
     
  2. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    _sheva740
    имитация движения мыши.
    Код (Text):
    1. .data?
    2.     pRect RECT <>
    3. .code
    4. start:
    5.     push 'd'
    6.     push 'nWya'
    7.     push 'rT_l'
    8.     push 'lehS'
    9.     mov ecx,esp
    10.         push NULL
    11.         push ecx
    12.     call FindWindow
    13.     pop ecx
    14.     pop ecx
    15.     pop ecx
    16.     pop ecx
    17.         push GW_CHILD
    18.         push eax
    19.     call GetWindow
    20.         push GW_HWNDNEXT
    21.         push eax
    22.     call GetWindow
    23.         push GW_CHILD
    24.         push eax
    25.     call GetWindow
    26.         push GW_HWNDNEXT
    27.         push eax
    28.     call GetWindow
    29.         push GW_CHILD
    30.         push eax
    31.     call GetWindow
    32.     mov ebx,eax
    33.         push offset pRect
    34.         push eax
    35.     call GetWindowRect
    36.     mov esi,pRect.right
    37.     sub esi,pRect.left
    38.     xor edi,edi
    39. @@:  push edi
    40.         push 0
    41.         push WM_MOUSEMOVE
    42.         push ebx
    43.     call PostMessage
    44.     inc edi
    45.     cmp edi,esi
    46.     jbe @b
    47.         push NULL
    48.     call ExitProcess
    49. end start
     
  3. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Не занимайтесь гуанокодингом.
    Shell_NotifyIcon(NIM_DELETE, ...
     
  4. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    for All
    Спасибо за помощь!
     
  5. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    У меня такая задача.
    Программно завершаю работу стороннего процесса. Значок в трее остаётся. Надо убрать его оттуда.
    Не понятно как пользоваться Shell_NotifyIcon. При вызове этой функции выводится сообщение об ошибке.
     
  6. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    gale1238
    надо знать хендл окна, к которому была привязана эта иконка и ID иконки.
     
  7. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    Очистить поднос от битой посуды можно по-другому.
    Код (Text):
    1. EXTRADATA struct
    2.     Wnd dd ?
    3.     uID dd ?
    4. EXTRADATA ends
    5. .data?
    6.     IconsCount dd ?
    7.     hProcess dd ?
    8.     hTaskbar dd ?
    9.     hToolbar dd ?
    10.     pData dd ?
    11.     ProcessId dd ?
    12.     button TBBUTTON <>
    13.     extra EXTRADATA <>
    14. .code
    15. start:
    16.     push 'd'
    17.     push 'nWya'
    18.     push 'rT_l'
    19.     push 'lehS'
    20.     mov ecx,esp
    21.         push NULL
    22.         push ecx
    23.     call FindWindow
    24.     pop ecx
    25.     pop ecx
    26.     pop ecx
    27.     pop ecx
    28.     mov hTaskbar,eax
    29.         push GW_CHILD
    30.         push eax
    31.     call GetWindow
    32.         push GW_HWNDNEXT
    33.         push eax
    34.     call GetWindow
    35.         push GW_CHILD
    36.         push eax
    37.     call GetWindow
    38.         push GW_HWNDNEXT
    39.         push eax
    40.     call GetWindow
    41.         push GW_CHILD
    42.         push eax
    43.     call GetWindow
    44.     mov hToolbar,eax
    45.         push 0
    46.         push 0
    47.         push TB_BUTTONCOUNT
    48.         push eax
    49.     call SendMessage
    50.     test eax,eax
    51.     jz @e
    52.     mov IconsCount,eax
    53.         push offset ProcessId
    54.         push hToolbar
    55.     call GetWindowThreadProcessId
    56.         push ProcessId
    57.         push FALSE
    58.         push PROCESS_ALL_ACCESS
    59.     call OpenProcess
    60.     mov hProcess,eax
    61.         push PAGE_READWRITE
    62.         push MEM_COMMIT
    63.         push sizeof button
    64.         push NULL
    65.         push eax
    66.     call VirtualAllocEx
    67.     mov pData,eax
    68. @l: dec IconsCount
    69.         push pData
    70.         push IconsCount
    71.         push TB_GETBUTTON
    72.         push hToolbar
    73.     call SendMessage
    74.         push NULL
    75.         push sizeof button
    76.         push offset button
    77.         push pData
    78.         push hProcess
    79.     call ReadProcessMemory
    80.         push NULL
    81.         push sizeof extra
    82.         push offset extra
    83.         push button.dwData
    84.         push hProcess
    85.     call ReadProcessMemory
    86.     mov eax,extra.uID
    87.     test eax,80000000h
    88.     jnz @f
    89.         push extra.Wnd
    90.     call IsWindow
    91.     test eax,eax
    92.     jnz @f
    93.         push 0
    94.         push IconsCount
    95.         push TB_DELETEBUTTON
    96.         push hToolbar
    97.     call SendMessage
    98.         push 0
    99.         push 0
    100.         push WM_SETTINGCHANGE
    101.         push hTaskbar
    102.     call SendMessage
    103. @@: cmp IconsCount,0
    104.     ja @l
    105.         push MEM_RELEASE
    106.         push 0
    107.         push pData
    108.         push hProcess
    109.     call VirtualFreeEx
    110.         push hProcess
    111.     call CloseHandle
    112. @e:  push NULL
    113.     call ExitProcess
    114. end start
     
  8. Milenka1988

    Milenka1988 Милена Никонова

    Публикаций:
    0
    Регистрация:
    28 ноя 2011
    Сообщения:
    1
    Адрес:
    Москва
    Спасибо, пригодилось!
     
  9. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    gale1238
    Спасибо!