В отдельном потоке создаю какую то процедуру. В ней доходит до проверки ввода пользователя типа "да" - "нет", которое производиться MessageBox - ом. В своей програмке я предусмотрел аварийное завершение потока. Но - если во время завершения потока я вижу мессаджбокс, то фокус вернуть основному окну не могу. Подскажите, в чем трабла? Код (Text): .... invoke MessageBox,hWindow,CTXT("Удалить?"),CTXT ("Внимание!!!"),\ MB_APPLMODAL or MB_OKCANCEL or MB_ICONERROR .if eax == 1 .... DisableOperation proc hWnd:HWND;, tiP:dword .if hWnd == 0 m2m hWnd,hWindow .endif invoke ShowWindow,hwndprogress,SW_HIDE invoke KillTimer,hWnd,1 invoke KillTimer,hWnd,2 invoke KillTimer,hWnd,3 invoke TerminateThread,pokur,0 invoke SendMessage,hStatus,SB_SETTEXT,0,CTXT("Не подключен") invoke SendMessage,hStatus,SB_SETTEXT,2,0 invoke EndWinsock invoke GlobalFree,hMemoryText invoke GlobalFree,hMemory invoke EnableWindow,hwndbutton3,TRUE invoke EnableWindow,hwndbutton5,FALSE invoke SendMessage,hwndmemo1,WM_SETTEXT,0,0 invoke SendMessage,hwndbutton3,WM_SETFOCUS,0,0 invoke TerminateThread,tiP,0 ret DisableOperation endp
Фокус можно контролировать только из потока, который создал окно, т.е. из основного потока не получится так просто вызвать SetFocus на окно чужого потока. Есть, конечно, обходные пути, но мне пока не совсем ясна суть задачи.
Quantum Суть задачи в следующем: в потоке создается месаждбокс. При вызове процедуры TerminateThread окно месаджбокса закрываеться. НО - так как необходимо, чтобы окно было модальным для основного окна, выполняемого в основном потоке, окно месаджбокса перехватывает фокус и исчезает... То есть на основном окне все контролы недоступны FreeManCPM Здравая идея, спасибо за подсказку.
OFFSIDE Ясно... Но я бы не стал использовать TerminateThread. Идеальное решение - чтоб тред сам завершался по сигналу.
OFFSIDE Обычной глобальной переменной достаточно и чтоб тред при каждом удобном случае проверял её значение. Nouzui На MessageBox можно повесить хук, чтоб периодически (по таймеру) опрашивать состояние события пока он активен. Пример можно тут посмотреть: http://www.codeproject.com/dialog/msgboxdemo.asp
ой.. ой, оййй.. я бы сразу все стер и написал бы собственный диалог (1) 2. легче пронумеровать в том потоке окошки и послать WM_CLOSE, раз уж один фиг писать код для поиска hwnd зы а с таймером интересно получается, я даже не обращал внимания, что в первом параметре может быть NULL. Надо будет запомнить...
OFFSIDE в смысле? ты же сам вызываешь этот бокс GetCurrentThreadId(), сохраняем в глобальную переменную вообще смысл не в том, чтобы пронумеровать окошки, а в том, чтобы найти hwnd месажбокса, просто мне не приходит на ум ничего лучше, чем нумерация
Nouzui Так вот именно - как найти hWnd мессаджбокса? Я ведь могу сохранять в глобальную переменную именно его... А потом посылать WM_CLOSE... И перечисление по EnumThreadWindows, и с заполнением структуры Код (Text): GUITHREADINFO STRUCT cbSize DWORD ? flags DWORD ? hwndActive DWORD ? hwndFocus DWORD ? hwndCapture DWORD ? hwndMenuOwner DWORD ? hwndMoveSize DWORD ? hwndCaret DWORD ? rcCaret RECT <> GUITHREADINFO ENDS mov tred.cbSize,sizeof tred invoke GetGUIThreadInfo,OwnThread,addr tred mov ebx,tred.hwndActive fn MessageBox,0,str$(ebx),"123",MB_OK так же ничего не дает...
OFFSIDE Код (Text): DWORD APIENTRY ThreadProc(LPVOID); DWORD dwThreadId; int APIENTRY Entry() { // TODO: Place code here. DWORD dwTid; dwThreadId= GetCurrentThreadId(); CreateThread(NULL, 0, ThreadProc, NULL, 0, &dwTid); MessageBox(NULL, "", "", 0); return 0; } DWORD APIENTRY ThreadProc(LPVOID) { GUITHREADINFO stGUIThreadInfo; MessageBox(NULL, "Close it", "", 0); stGUIThreadInfo.cbSize= sizeof(stGUIThreadInfo); if(GetGUIThreadInfo(dwThreadId, &stGUIThreadInfo)) { SendMessage(stGUIThreadInfo.hwndActive, WM_CLOSE, 0, 0); } return 0; } файлик почему-то не аттачится приаттачил..
Nouzui Битый аттач) . Но то что ты на си написал повторение того, что написано мной на масме постом ранее) У меня почему то не работает... Если можно, приаттач исходник с рабочей версией плиз.
OFFSIDE у меня качается, попробуй download master я не совсем уловил: ты в своем исходнике сначала вызвал GetGUIThreadInfo, потом MessageBox, в одном потоке. Естественно, никакого хэндла окошка ты не получишь полный проект в аттаче
Nouzui Спасибо, понял свой косяк: я в GetGUIThreadInfo запихивал ID вновь создаваемого треда... А ты указываешь ID основного потока. Поэтому и ловишь хендл активного окна. Виндовс маст дай.