Убить MessageBox в потоке?

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

  1. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    В отдельном потоке создаю какую то процедуру. В ней доходит до проверки ввода пользователя типа "да" - "нет", которое производиться MessageBox - ом. В своей програмке я предусмотрел аварийное завершение потока. Но - если во время завершения потока я вижу мессаджбокс, то фокус вернуть основному окну не могу. Подскажите, в чем трабла?

    Код (Text):
    1. ....
    2.     invoke MessageBox,hWindow,CTXT("Удалить?"),CTXT ("Внимание!!!"),\
    3. MB_APPLMODAL  or MB_OKCANCEL or MB_ICONERROR
    4.     .if eax == 1
    5. ....
    6.  
    7.  
    8.  
    9. DisableOperation proc hWnd:HWND;, tiP:dword
    10. .if hWnd == 0
    11.     m2m hWnd,hWindow
    12. .endif
    13. invoke ShowWindow,hwndprogress,SW_HIDE
    14.     invoke KillTimer,hWnd,1
    15.     invoke KillTimer,hWnd,2
    16.     invoke KillTimer,hWnd,3
    17.     invoke TerminateThread,pokur,0
    18.     invoke SendMessage,hStatus,SB_SETTEXT,0,CTXT("Не подключен")
    19.     invoke SendMessage,hStatus,SB_SETTEXT,2,0
    20.     invoke EndWinsock
    21.     invoke GlobalFree,hMemoryText
    22.     invoke GlobalFree,hMemory
    23.     invoke EnableWindow,hwndbutton3,TRUE
    24.     invoke EnableWindow,hwndbutton5,FALSE
    25.     invoke SendMessage,hwndmemo1,WM_SETTEXT,0,0
    26.     invoke SendMessage,hwndbutton3,WM_SETFOCUS,0,0
    27.     invoke TerminateThread,tiP,0
    28.     ret
    29. DisableOperation endp
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Фокус можно контролировать только из потока, который создал окно, т.е. из основного потока не получится так просто вызвать SetFocus на окно чужого потока. Есть, конечно, обходные пути, но мне пока не совсем ясна суть задачи.
     
  3. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    найди окно мессаджбокса и закрой его програмно
     
  4. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    Quantum
    Суть задачи в следующем: в потоке создается месаждбокс. При вызове процедуры TerminateThread окно месаджбокса закрываеться. НО - так как необходимо, чтобы окно было модальным для основного окна, выполняемого в основном потоке, окно месаджбокса перехватывает фокус и исчезает... То есть на основном окне все контролы недоступны :)

    FreeManCPM
    Здравая идея, спасибо за подсказку.
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    OFFSIDE
    Ясно... Но я бы не стал использовать TerminateThread. Идеальное решение - чтоб тред сам завершался по сигналу.
     
  6. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    Quantum

    А как послать такой сигнал? И как заставить тред его обработать?
     
  7. P_F

    P_F New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2006
    Сообщения:
    116
    Адрес:
    Russia
    CreateEvent + WaitForSingleObject + SetEvent/ResetEvent
     
  8. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    P_F
    А можно технологию поподробнее? Или ссылку чтоб почитать?
     
  9. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    тред же в мессагбоксе будет..
     
  10. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    OFFSIDE
    Обычной глобальной переменной достаточно и чтоб тред при каждом удобном случае проверял её значение.

    Nouzui
    На MessageBox можно повесить хук, чтоб периодически (по таймеру) опрашивать состояние события пока он активен. Пример можно тут посмотреть:
    http://www.codeproject.com/dialog/msgboxdemo.asp
     
  11. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    ой.. ой, оййй..
    я бы сразу все стер и написал бы собственный диалог (1)
    2. легче пронумеровать в том потоке окошки и послать WM_CLOSE, раз уж один фиг писать код для поиска hwnd

    зы а с таймером интересно получается, я даже не обращал внимания, что в первом параметре может быть NULL. Надо будет запомнить...
     
  12. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    Nouzui
    Как определить, из какого потока запущен месаджбокс?
     
  13. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    OFFSIDE
    в смысле? ты же сам вызываешь этот бокс
    GetCurrentThreadId(), сохраняем в глобальную переменную
    вообще смысл не в том, чтобы пронумеровать окошки, а в том, чтобы найти hwnd месажбокса, просто мне не приходит на ум ничего лучше, чем нумерация
     
  14. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    Nouzui

    Так вот именно - как найти hWnd мессаджбокса? Я ведь могу сохранять в глобальную переменную именно его... А потом посылать WM_CLOSE... И перечисление по EnumThreadWindows, и с заполнением структуры
    Код (Text):
    1. GUITHREADINFO STRUCT
    2.     cbSize DWORD       ?
    3.     flags DWORD       ?
    4.     hwndActive DWORD       ?
    5.     hwndFocus DWORD       ?
    6.     hwndCapture DWORD       ?
    7.     hwndMenuOwner DWORD       ?
    8.     hwndMoveSize DWORD       ?
    9.     hwndCaret DWORD       ?
    10.     rcCaret RECT        <>
    11. GUITHREADINFO ENDS
    12.     mov tred.cbSize,sizeof tred
    13.     invoke GetGUIThreadInfo,OwnThread,addr tred
    14.     mov ebx,tred.hwndActive
    15. fn MessageBox,0,str$(ebx),"123",MB_OK
    так же ничего не дает...
     
  15. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    как насчет FindWindow?

    или EnumThreadWindows
     
  16. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    OFFSIDE
    Код (Text):
    1. DWORD APIENTRY ThreadProc(LPVOID);
    2. DWORD dwThreadId;
    3.  
    4. int APIENTRY Entry()
    5. {
    6.     // TODO: Place code here.
    7.     DWORD dwTid;
    8.  
    9.     dwThreadId= GetCurrentThreadId();
    10.     CreateThread(NULL, 0, ThreadProc, NULL, 0, &dwTid);
    11.  
    12.     MessageBox(NULL, "", "", 0);
    13.    
    14.     return 0;
    15. }
    16.  
    17. DWORD APIENTRY ThreadProc(LPVOID)
    18. {
    19.     GUITHREADINFO stGUIThreadInfo;
    20.     MessageBox(NULL, "Close it", "", 0);
    21.  
    22.     stGUIThreadInfo.cbSize= sizeof(stGUIThreadInfo);
    23.     if(GetGUIThreadInfo(dwThreadId, &stGUIThreadInfo))
    24.     {
    25.         SendMessage(stGUIThreadInfo.hwndActive, WM_CLOSE, 0, 0);
    26.     }
    27.  
    28.     return 0;
    29. }
    файлик почему-то не аттачится

    приаттачил..
     
  17. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    Nouzui

    Битый аттач) . Но то что ты на си написал повторение того, что написано мной на масме постом ранее) У меня почему то не работает... Если можно, приаттач исходник с рабочей версией плиз.
     
  18. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    OFFSIDE
    у меня качается, попробуй download master
    я не совсем уловил: ты в своем исходнике сначала вызвал GetGUIThreadInfo, потом MessageBox, в одном потоке. Естественно, никакого хэндла окошка ты не получишь
    полный проект в аттаче
     
  19. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    Nouzui

    Спасибо, понял свой косяк: я в GetGUIThreadInfo запихивал ID вновь создаваемого треда... А ты указываешь ID основного потока. Поэтому и ловишь хендл активного окна. Виндовс маст дай.