Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Развернуть программу из трея |
Автор: greys 26.3.2016, 14:07 |
Здравствуйте! Есть программа, которая при запуске сразу сворачивается иконкой в трей. Какого-либо штатного способа запустить её открытой нет. Мне необходимо программно её развернуть. Третий день бьюсь - ничего не получается. Перерыл весь интернет - рабочего решения не нашел. Как я понял, обратиться программно к значку иконке в трее нельзя, но вроде бы если послать хэндлу программы, который я нахожу с помощью FindWindow, все те команды, что посылаются при клике по значку, то окно должно теорически развернуться. Верно? Если да, помогите перевести на язык программирования лог программы Spy++. Заранее спасибо! 00B400E6 R WM_PSD_FULLPAGERECT fPreventDraw:False [lResult:00000000] 00B400E6 R WM_PSD_FULLPAGERECT fPreventDraw:False [lResult:00000000] 00B400E6 R WM_PSD_FULLPAGERECT fPreventDraw:False [lResult:00000000] 00B400E6 S WM_PSD_FULLPAGERECT hDC:00000064 lprcPage:00000200 [wParam:00000064 lParam:00000200] 00B400E6 R WM_PSD_FULLPAGERECT fPreventDraw:False [lResult:00000000] 00B400E6 S WM_PSD_FULLPAGERECT hDC:00000064 lprcPage:00000200 [wParam:00000064 lParam:00000200] 00B400E6 R WM_PSD_FULLPAGERECT fPreventDraw:False [lResult:00000000] 00B400E6 S WM_PSD_FULLPAGERECT hDC:00000064 lprcPage:00000200 [wParam:00000064 lParam:00000200] 00B400E6 S WM_PSD_FULLPAGERECT hDC:00000064 lprcPage:00000201 [wParam:00000064 lParam:00000201] 00B400E6 R WM_PSD_FULLPAGERECT fPreventDraw:False [lResult:00000000] 00B400E6 R WM_PSD_FULLPAGERECT fPreventDraw:False [lResult:00000000] 004403DA S WM_NCCREATE lpcs:0012F460 [wParam:00000000 lParam:0012F460] 004403DA R WM_SIZE lResult:00000000 004403DA R message:0x040A [User-defined:WM_USER+10] lResult:00000001 004D0328 S WM_WINDOWPOSCHANGING lpwp:0012F744 [wParam:00000000 lParam:0012F744] 003802F2 S WM_WINDOWPOSCHANGED lpwp:0012F744 [wParam:00000000 lParam:0012F744] 007603CC R WM_WINDOWPOSCHANGING lResult:00000000 00330326 R WM_WINDOWPOSCHANGING lResult:00000000 037D0306 R WM_NCCREATE fContinue:True [lResult:00000001] 037D0306 R WM_PARENTNOTIFY lResult:00000000 037D0306 R WM_PARENTNOTIFY lResult:00000000 037D0306 R WM_COMMAND lResult:00000000 00220512 S EM_SETMARGINS fwMargin:EC_LEFTMARGIN | EC_RIGHTMARGIN wLeft:0 wRight:0 [wParam:00000003 lParam:00000000] 00220512 R WM_WINDOWPOSCHANGED lResult:00000000 037D0306 R WM_COMMAND lResult:00000000 002E065A S WM_MOVE xPos:210 yPos:4 [wParam:00000000 lParam:000400D2] 002E065A R WM_WINDOWPOSCHANGED lResult:00000000 025D0108 R WM_WINDOWPOSCHANGED lResult:00000000 13960056 S WM_WINDOWPOSCHANGING lpwp:0012F7A8 [wParam:00000000 lParam:0012F7A8] 13960056 R WM_WINDOWPOSCHANGED lResult:00000000 000E0608 R WM_CREATE fContinue:0 (continue creation) [lResult:00000000] 000E0608 R WM_WINDOWPOSCHANGED lResult:00000000 002705F6 S WM_CREATE lpcs:0012F258 [wParam:00000000 lParam:0012F258] 00C900EE R message:0x1309 [User-defined:WM_USER+3849] lResult:00000001 13960056 R message:0x1328 [User-defined:WM_USER+3880] lResult:00000000 00C900EE R WM_SIZE lResult:00000000 00C50086 S WM_WINDOWPOSCHANGING lpwp:0012F5B4 [wParam:00000000 lParam:0012F5B4] 00C900EE S message:0x1328 [User-defined:WM_USER+3880] wParam:00000000 lParam:0012F044 13960056 S message:0x1328 [User-defined:WM_USER+3880] wParam:00000000 lParam:0012EFF0 00B400E6 S WM_WINDOWPOSCHANGING lpwp:0012F710 [wParam:00000000 lParam:0012F710] 13960056 R message:0x1328 [User-defined:WM_USER+3880] lResult:00000000 00B400E6 S WM_WINDOWPOSCHANGING lpwp:0012F5BC [wParam:00000000 lParam:0012F5BC] 00B400E6 R WM_GETTEXT cchCopied:14 lpszText:0012EA60 ("User Gate V2.8") [lResult:0000000E] 00B400E6 S message:0xB000 [User-defined:WM_APP+12288] wParam:00000000 lParam:00000000 13960056 R message:0xB01A [User-defined:WM_APP+12314] lResult:00000000 00B400E6 S WM_GETTEXT cchTextMax:510 lpszText:0012EA10 [wParam:000001FE lParam:0012EA10] 00B400E6 R WM_GETTEXT cchCopied:14 lpszText:0012EA10 ("User Gate V2.8") [lResult:0000000E] 00B703F0 S WM_ERASEBKGND hdc:13011338 [wParam:13011338 lParam:00000000] 004403DA R WM_NCPAINT lResult:00000000 00B400E6 S WM_WINDOWPOSCHANGED lpwp:0012F77C [wParam:00000000 lParam:0012F77C] 00B400E6 S WM_SIZE fwSizeType:SIZE_RESTORED nWidth:619 nHeight:486 [wParam:00000000 lParam:01E6026B] 13960056 R WM_IME_SETCONTEXT lResult:00000000 13960056 S WM_IME_SETCONTEXT fSet:1 iShow:C000000F [wParam:00000001 lParam:C000000F] 00B400E6 R WM_PSD_FULLPAGERECT fPreventDraw:False [lResult:00000000] 037D0306 P WM_PAINT hdc:00000000 [wParam:00000000 lParam:00000000] 037D0306 P WM_PAINT hdc:00000000 [wParam:00000000 lParam:00000000] 037D0306 P WM_PAINT hdc:00000000 [wParam:00000000 lParam:00000000] 037D0306 P WM_PAINT hdc:00000000 [wParam:00000000 lParam:00000000] 037D0306 P WM_PAINT hdc:00000000 [wParam:00000000 lParam:00000000] 037D0306 R WM_CTLCOLORSTATIC hBrush:94100FC2 [lResult:94100FC2] 004D0328 R message:0xBD38 [User-defined:WM_APP+15672] lResult:CF100720 001D0590 P WM_PAINT hdc:00000000 [wParam:00000000 lParam:00000000] 001D0590 P WM_PAINT hdc:00000000 [wParam:00000000 lParam:00000000] 00B400E6 R WM_PSD_FULLPAGERECT fPreventDraw:False [lResult:00000000] 00B400E6 R WM_PSD_FULLPAGERECT fPreventDraw:False [lResult:00000000] 001D0590 P WM_PAINT hdc:00000000 [wParam:00000000 lParam:00000000] 001D0590 P WM_PAINT hdc:00000000 [wParam:00000000 lParam:00000000] 001D0590 P WM_PAINT hdc:00000000 [wParam:00000000 lParam:00000000] 001D0590 P WM_PAINT hdc:00000000 [wParam:00000000 lParam:00000000] 001D0590 P WM_PAINT hdc:00000000 [wParam:00000000 lParam:00000000] |
Автор: greys 26.3.2016, 15:17 | ||
Нашел другой вариант, но он как-то криво работает: не отображается содержимое окна/вкладок и самое главное - нет статусбара, а из него мне нужно считывать данные.
Подскажите, можно ли как-то послать другому окну команду, чтобы оно отобразило статусбар? |
Автор: YDean 26.3.2016, 19:49 |
Судя по 0x040A [User-defined:WM_USER+10] создатель программы регистрирует значок в трее функцией Shell_NotifyIcon с указателем на NOTIFYICONDATA, содержащем в uCallbackMessage значение WM_USER + 10. Если окну программы послать WM_USER+10 с правильными wParam и lParam, оно должно развернуться. wParam - идентификатор значка. (Кто знает, что он там прописал, и анализирует ли он его при приёме?) lParam - мышиное сообщение (WM_LBUTTONDBLCLK ?) |
Автор: leniviy 27.3.2016, 11:10 |
Я бы не заморачивался с c++, а скачал бы старый добрый autohotkey Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Razvernut-programmu-iz-treya-id56f66dd8ae20155e7c8b4567#findElement_E7045_56f79566ae2015db47d58aac_0 |
Автор: greys 27.3.2016, 17:28 |
Эту программу не пробовал, пробовал autoit - она не помогла, т.к. не может кликать по конкетрной иконке в трее, если положение иконки все время разное. YDean, спасибо за наводу. Сделал: SendMessage(wnd,WM_USER+1,NULL,WM_LBUTTONDBLCLK); и все разработало как надо! Даже как-то не верится что все так просто. Как-то подозрительно просто ![]() |