Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Нашел другой вариант, но он как-то криво работает: не отображается содержимое окна/вкладок и самое главное - нет статусбара, а из него мне нужно считывать данные.

Код

wnd = FindWindow(NULL, "app");
if (wnd!=NULL)
{
ShowWindow(wnd,SW_SHOWMAXIMIZED);
  
wnd= ::GetWindow (wnd, GW_CHILD);
ShowWindow(wnd,SW_SHOW);


Подскажите, можно ли как-то послать другому окну команду, чтобы оно отобразило статусбар?

Автор: 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
Цитата(leniviy @  27.3.2016,  11:10 Найти цитируемый пост)
autohotkey

Эту программу не пробовал, пробовал autoit - она не помогла, т.к. не может кликать по конкетрной иконке в трее, если положение иконки все время разное.


YDean, спасибо за наводу. Сделал:
            SendMessage(wnd,WM_USER+1,NULL,WM_LBUTTONDBLCLK);
и все разработало как надо!

Даже как-то не верится что все так просто. Как-то подозрительно просто smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)