Добрый день. Помогите разобраться !!!! Сторонняя прожка соединяется с ftp сервером и тянет там что-то, не суть ... Если сетка подгружена прожка подвисает на долго. Просьбы к разработчикам "устранить траблу"- не увенчались успехом. Выход простой - перегрузить прогу и делов-то. Прожка бросает иконку в трей. Решение - под XPSP3 процесс убивается (TerminateProcess()) и прога (ShellExecute())стартует снова, Но иконка в трее от старого процесса не уходит Хотя если мышкой поводить - пропадет. Пытаюсь найти трей и отослать ему сообщение - не помогает. Вопрос - как обновить иконки в трее под XP? Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\shell32.inc include \masm32\include\advapi32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\shell32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\advapi32.lib .data ini_file_conf db 1024 dup (0) szSection db "termsets",0 szKey_1 db "term_path",0 szKey_2 db "term_name",0 str_path db 100 dup(0) size_str_path =$-str_path str_name db 100 dup(0) size_str_name =$-str_name szNULL db 0 class1 db 'Shell_TrayWnd',0 ; Название класса окна трея class2 db 'TrayNotifyWnd',0 ; Название класса панели уведомлений class3 db 'SysPager',0 ; Трей class4 db 'ToolbarWindow32',0 ; Панель с иконками errors db ':(((',0 .data? hSnapshot HANDLE ? ProcEnt PROCESSENTRY32 <?> .code start: push offset ini_file_conf ; директорию push 2048 ; файла call GetCurrentDirectory ; mov dword ptr [ini_file_conf+eax+0],'ret\' ; Добавим к буферу \pop3set.ini mov dword ptr [ini_file_conf+eax+4],'tesm' ; имя инишки mov dword ptr [ini_file_conf+eax+8],'ini.' ; mov byte ptr [ini_file_conf+eax+12],0 ; ---------------------------------- ; Переносим данные из ini - файла в строки invoke RtlZeroMemory, addr str_path, size_str_path invoke GetPrivateProfileString, addr szSection, addr szKey_1,\ addr szNULL, addr str_path,\ size_str_path, addr ini_file_conf invoke GetPrivateProfileString, addr szSection, addr szKey_2,\ addr szNULL, addr str_name,\ size_str_name, addr ini_file_conf invoke CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS,0 .IF (eax != INVALID_HANDLE_VALUE) mov hSnapshot,eax mov [ProcEnt.dwSize],SIZEOF ProcEnt invoke Process32First, hSnapshot,ADDR ProcEnt .IF (eax) @@: invoke lstrcmpi, ADDR str_name ,ADDR [ProcEnt.szExeFile] .IF (eax == 0) invoke OpenProcess, PROCESS_TERMINATE,FALSE,[ProcEnt.th32ProcessID] .IF (eax) invoke TerminateProcess, eax,0 .ELSE .ENDIF .ENDIF invoke Process32Next, hSnapshot,ADDR ProcEnt test eax,eax jnz @B .ENDIF .ENDIF invoke CloseHandle, hSnapshot invoke Sleep,1000 ; Найти окно трея invoke FindWindow,offset class1,NULL or eax,eax jz __exit_process ; Найти панель уведомлений invoke FindWindowEx,eax,NULL,offset class2,NULL or eax,eax jz __exit_process ; Найти трей invoke FindWindowEx,eax,NULL,offset class3,NULL or eax,eax jz __exit_process ; Найти панель иконок в трее invoke FindWindowEx,eax,NULL,offset class4,NULL or eax,eax jz __exit_process invoke SendMessage, eax, WM_NOTIFY, NULL, NULL ;//???? __exit: invoke ExitProcess,0 __exit_process: invoke MessageBoxA,NULL,addr errors, NULL, NULL jmp __exit END start Тестирую на проге из Ишелиона урока 23 - trayicon.exe Да для тестов нужно ini -шку termset.ini подправить, путь изменить. Помогите разобраться !!!!
_sheva740 имитация движения мыши. Код (Text): .data? pRect RECT <> .code start: push 'd' push 'nWya' push 'rT_l' push 'lehS' mov ecx,esp push NULL push ecx call FindWindow pop ecx pop ecx pop ecx pop ecx push GW_CHILD push eax call GetWindow push GW_HWNDNEXT push eax call GetWindow push GW_CHILD push eax call GetWindow push GW_HWNDNEXT push eax call GetWindow push GW_CHILD push eax call GetWindow mov ebx,eax push offset pRect push eax call GetWindowRect mov esi,pRect.right sub esi,pRect.left xor edi,edi @@: push edi push 0 push WM_MOUSEMOVE push ebx call PostMessage inc edi cmp edi,esi jbe @b push NULL call ExitProcess end start
У меня такая задача. Программно завершаю работу стороннего процесса. Значок в трее остаётся. Надо убрать его оттуда. Не понятно как пользоваться Shell_NotifyIcon. При вызове этой функции выводится сообщение об ошибке.
Очистить поднос от битой посуды можно по-другому. Код (Text): EXTRADATA struct Wnd dd ? uID dd ? EXTRADATA ends .data? IconsCount dd ? hProcess dd ? hTaskbar dd ? hToolbar dd ? pData dd ? ProcessId dd ? button TBBUTTON <> extra EXTRADATA <> .code start: push 'd' push 'nWya' push 'rT_l' push 'lehS' mov ecx,esp push NULL push ecx call FindWindow pop ecx pop ecx pop ecx pop ecx mov hTaskbar,eax push GW_CHILD push eax call GetWindow push GW_HWNDNEXT push eax call GetWindow push GW_CHILD push eax call GetWindow push GW_HWNDNEXT push eax call GetWindow push GW_CHILD push eax call GetWindow mov hToolbar,eax push 0 push 0 push TB_BUTTONCOUNT push eax call SendMessage test eax,eax jz @e mov IconsCount,eax push offset ProcessId push hToolbar call GetWindowThreadProcessId push ProcessId push FALSE push PROCESS_ALL_ACCESS call OpenProcess mov hProcess,eax push PAGE_READWRITE push MEM_COMMIT push sizeof button push NULL push eax call VirtualAllocEx mov pData,eax @l: dec IconsCount push pData push IconsCount push TB_GETBUTTON push hToolbar call SendMessage push NULL push sizeof button push offset button push pData push hProcess call ReadProcessMemory push NULL push sizeof extra push offset extra push button.dwData push hProcess call ReadProcessMemory mov eax,extra.uID test eax,80000000h jnz @f push extra.Wnd call IsWindow test eax,eax jnz @f push 0 push IconsCount push TB_DELETEBUTTON push hToolbar call SendMessage push 0 push 0 push WM_SETTINGCHANGE push hTaskbar call SendMessage @@: cmp IconsCount,0 ja @l push MEM_RELEASE push 0 push pData push hProcess call VirtualFreeEx push hProcess call CloseHandle @e: push NULL call ExitProcess end start