проблемы EnumWindows
От: Mihajlo  
Дата: 11.01.11 12:04
Оценка:
Господа программисты, подскажите пожалуйста!

Вот код:

struct process_win
{
DWORD process_id; // id процесса
HWND hwnd; // handle окна
};

BOOL CALLBACK EnumThreadWndProc( HWND hWnd, LPARAM lParam )
{
process_win* pw = (process_win*)lParam;
DWORD win_id;
GetWindowThreadProcessId( hWnd, &win_id );
if( win_id == pw->process_id )
{
pw->hwnd = hWnd;
return false;
}
return true;
}

int func()
{
.......
info.lpVerb = "openas";
if( ShellExecuteEx( &info ) )
{
process_win pw;
pw.process_id = GetProcessId( info.hProcess );
EnumWindows( EnumThreadWndProc, (LPARAM)&pw );
SetFocus( pw.hwnd );
}
.......
}

Проблема:
Вызов ShellExecuteEx с lpVerb = "openas" открывает диплог выбора приложения для открытия файла. НО!!! Этот диалог не получает фокус=( И я по своей простоте душевной думал, если я получу id процесса(диалога) и переберу все окна, и сравню id процесса(диалога) с id процесса(окна), и если они совпадут, то будет мне счастье! id процесса(диалога) правильный, я проверял Spy'ем.
Как оказалось ничего подобного=( Этот диалог EnumWindows не нашел=( Возможно потому-что у этого диалога стиль стоит WS_POPUP...
Кто-нибудь с этим сталкивался? Как мне найти этот диалог?
Re: проблемы EnumWindows
От: De-Bugger  
Дата: 11.01.11 13:10
Оценка:
Здравствуйте, Mihajlo, Вы писали:

M>Господа программисты, подскажите пожалуйста!


M> .......

M> info.lpVerb = "openas";
Попробуйте это:
info.hwnd = m_hwnd

M> if( ShellExecuteEx( &info ) )


P.S. Раз уж зарегистрировались и используете
Автор: De-Bugger
Дата: 10.01.11
советы, которые вам дают, научитесь и оценки ставить
Re[2]: проблемы EnumWindows
От: Mihajlo  
Дата: 12.01.11 10:11
Оценка:
Здравствуйте, De-Bugger, Вы писали:

DB>Попробуйте это:

DB>info.hwnd = m_hwnd

я не допонял, а что это за m_hwnd. откуда я его возьму?
Re: проблемы EnumWindows
От: kero Россия  
Дата: 12.01.11 15:44
Оценка:
Здравствуйте, Mihajlo, Вы писали:

M> EnumWindows( EnumThreadWndProc, (LPARAM)&pw );


??
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re: проблемы EnumWindows
От: shasa  
Дата: 13.01.11 21:52
Оценка:
Здравствуйте, Mihajlo, Вы писали:

M>Проблема:

M>Вызов ShellExecuteEx с lpVerb = "openas" открывает диплог выбора приложения для открытия файла. НО!!! Этот диалог не получает фокус

1. Фокус должен быть обязательно.
2. Непонятное поведение окна признак повреждения памяти.
3. Повреждения памяти часто встречаются при роботе с си-строками.
4. Посмотри все вызовы сишных функций для работы со строками.
5. Посмотри все вызовы типа SendMessage (hWnd, WM_SETTEXT, 0, (LPARAM)str), т.е. там где есть передача строки системе.

Держи в уме что все строки должны заканчиваться символом '\0'
Re: проблемы EnumWindows
От: CEMb  
Дата: 14.01.11 08:03
Оценка:
Здравствуйте, Mihajlo, Вы писали:

M>Как оказалось ничего подобного=( Этот диалог EnumWindows не нашел=( Возможно потому-что у этого диалога стиль стоит WS_POPUP...

M>Кто-нибудь с этим сталкивался? Как мне найти этот диалог?

msdn said:

The EnumWindows function enumerates all top-level windows on the screen


окно, поднимаемое openas — не есть top-level, даже если его спай так показывает
Re: проблемы EnumWindows
От: Pavel Dvorkin Россия  
Дата: 14.01.11 13:47
Оценка:
Здравствуйте, Mihajlo, Вы писали:

M>Вызов ShellExecuteEx с lpVerb = "openas" открывает диплог выбора приложения для открытия файла. НО!!! Этот диалог не получает фокус=( И я по своей простоте душевной думал, если я получу id процесса(диалога) и переберу все окна, и сравню id процесса(диалога) с id процесса(окна), и если они совпадут, то будет мне счастье!


Каким образом ты намерен перебрать окна процесса ? В твоем примере ты перебираешь окна потока, а вовсе не процесса. Поэтому не исключено, что это окно принадлежит другому потоку этого же процесса.

>id процесса(диалога) правильный, я проверял Spy'ем.


А проверить ID потока этого диалога можно было и сравнить с ID потока основного окна ?
With best regards
Pavel Dvorkin
Re[2]: проблемы EnumWindows
От: Pavel Dvorkin Россия  
Дата: 14.01.11 13:48
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Здравствуйте, Mihajlo, Вы писали:


M>>Как оказалось ничего подобного=( Этот диалог EnumWindows не нашел=( Возможно потому-что у этого диалога стиль стоит WS_POPUP...

M>>Кто-нибудь с этим сталкивался? Как мне найти этот диалог?

CEM>msdn said:

CEM>

CEM>The EnumWindows function enumerates all top-level windows on the screen


CEM>окно, поднимаемое openas — не есть top-level, даже если его спай так показывает


ИМХО spy++ все же правильно показывает, надо просто посмотреть у него Parent Window в свойствах этого окна.
With best regards
Pavel Dvorkin
Re[3]: проблемы EnumWindows
От: CEMb  
Дата: 14.01.11 13:56
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

CEM>>окно, поднимаемое openas — не есть top-level, даже если его спай так показывает


PD>ИМХО spy++ все же правильно показывает, надо просто посмотреть у него Parent Window в свойствах этого окна.


Ну да, а я и не говорил, что неправильно я и сам его так показываю

PD>А проверить ID потока этого диалога можно было и сравнить с ID потока основного окна ?


А вот это проверить надо... к примеру, у GetOpenFileName — контекстное меню на списке файлов с последующими диалогами открывается в отдельных потоках
Re[4]: проблемы EnumWindows
От: Pavel Dvorkin Россия  
Дата: 14.01.11 14:13
Оценка:
Здравствуйте, CEMb, Вы писали:

PD>>А проверить ID потока этого диалога можно было и сравнить с ID потока основного окна ?


CEM>А вот это проверить надо... к примеру, у GetOpenFileName — контекстное меню на списке файлов с последующими диалогами открывается в отдельных потоках


http://rsdn.ru/forum/winapi/1295946.1.aspx
Автор: Pavel Dvorkin
Дата: 28.07.05
With best regards
Pavel Dvorkin
Re[5]: проблемы EnumWindows
От: CEMb  
Дата: 14.01.11 18:34
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, CEMb, Вы писали:


PD>>>А проверить ID потока этого диалога можно было и сравнить с ID потока основного окна ?


CEM>>А вот это проверить надо... к примеру, у GetOpenFileName — контекстное меню на списке файлов с последующими диалогами открывается в отдельных потоках


PD>http://rsdn.ru/forum/winapi/1295946.1.aspx
Автор: Pavel Dvorkin
Дата: 28.07.05


Не, там GUI поток с окнами открывается. Т.е. можно поднять свойства папки (в своём же процессе), а сам GetOpenFileName закрыть. Останется висеть окно свойств, в другом среде.
Re[4]: проблемы EnumWindows
От: kero Россия  
Дата: 14.01.11 22:36
Оценка:
CEM>>>окно, поднимаемое openas — не есть top-level, даже если его спай так показывает

не поясните — а какое ?

PD>>ИМХО spy++ все же правильно показывает, надо просто посмотреть у него Parent Window в свойствах этого окна.


как раз с Parent Window в свойствах у spy++ беда: путает parent и owner
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[5]: проблемы EnumWindows
От: CEMb  
Дата: 15.01.11 06:08
Оценка:
Здравствуйте, kero, Вы писали:

CEM>>>>окно, поднимаемое openas — не есть top-level, даже если его спай так показывает


K>не поясните — а какое ?


Какое окно?
Ну вот я сейчас в студии, в меню зашёл, File->Open. Открылся диалог, у него тред № N1, правая кнопка мышки на файле (любом) ->Properties — открылось окно, смотрю у него threadId — № N2, правая кнопка Open With -> Choose Program... Открывшееся окно со списком, ThreadId — № N3.

А вот про меню я нагнал. По крайней мере, в студии — оно из того же потока

PD>>>ИМХО spy++ все же правильно показывает, надо просто посмотреть у него Parent Window в свойствах этого окна.


K>как раз с Parent Window в свойствах у spy++ беда: путает parent и owner


А там ещё есть рут и анцестор рут, и я вот путаюсь, кто из этих четырёх (или их ещё больше?) за что отвечает
Re[6]: проблемы EnumWindows
От: kero Россия  
Дата: 15.01.11 08:33
Оценка:
CEM>>>>>окно, поднимаемое openas — не есть top-level, даже если его спай так показывает

K>>не поясните — а какое ?


CEM>Какое окно?

CEM>Ну вот я сейчас в студии, в меню зашёл, File->Open. Открылся диалог, у него тред № N1, правая кнопка мышки на файле (любом) ->Properties — открылось окно, смотрю у него threadId — № N2, правая кнопка Open With -> Choose Program... Открывшееся окно со списком, ThreadId — № N3.

Нет, спрашивал не о треде, а о том, какое поднимаемое openas окно, по-вашему, не top-level.

PD>>>>ИМХО spy++ все же правильно показывает, надо просто посмотреть у него Parent Window в свойствах этого окна.


K>>как раз с Parent Window в свойствах у spy++ беда: путает parent и owner


CEM>А там ещё есть рут и анцестор рут, и я вот путаюсь, кто из этих четырёх (или их ещё больше?) за что отвечает


Об этом см. здесь
Автор: kero
Дата: 05.08.07

Насчет ошибки Spy++ (всех версий): вычисляет parent — через GetParent и/или GetWindowLong(GWL_HWNDPARENT) без учета того, что и то, и другое могут выдавать как parent, так и owner. Игнорируя (появившуюся еще в 98) GetAncestor, при GA_PARENT дающую точный parent.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[7]: проблемы EnumWindows
От: CEMb  
Дата: 15.01.11 11:24
Оценка:
Здравствуйте, kero, Вы писали:

CEM>>>>>>окно, поднимаемое openas — не есть top-level, даже если его спай так показывает


K>>>не поясните — а какое ?


CEM>>Какое окно?

CEM>>Ну вот я сейчас в студии, в меню зашёл, File->Open. Открылся диалог, у него тред № N1, правая кнопка мышки на файле (любом) ->Properties — открылось окно, смотрю у него threadId — № N2, правая кнопка Open With -> Choose Program... Открывшееся окно со списком, ThreadId — № N3.

K>Нет, спрашивал не о треде, а о том, какое поднимаемое openas окно, по-вашему, не top-level.


А, ну, наверно, у которого GetParent(hWnd) не пуст. Ну, даже наверно не по-моему, а по EnumWindows-оему
Re[8]: проблемы EnumWindows
От: kero Россия  
Дата: 15.01.11 15:14
Оценка:
Здравствуйте, CEMb, Вы писали:

K>>Нет, спрашивал не о треде, а о том, какое поднимаемое openas окно, по-вашему, не top-level.


CEM>А, ну, наверно, у которого GetParent(hWnd) не пуст. Ну, даже наверно не по-моему, а по EnumWindows-оему


Ну, не верно же.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[9]: проблемы EnumWindows
От: CEMb  
Дата: 17.01.11 08:31
Оценка:
Здравствуйте, kero, Вы писали:

K>>>Нет, спрашивал не о треде, а о том, какое поднимаемое openas окно, по-вашему, не top-level.


CEM>>А, ну, наверно, у которого GetParent(hWnd) не пуст. Ну, даже наверно не по-моему, а по EnumWindows-оему


K>Ну, не верно же.


А как?

msdn about top-level window (Glossary):

top-level window
A window that has no parent window.


Т.е. сюда же относим окна с непустым овнером?
Re[10]: проблемы EnumWindows
От: kero Россия  
Дата: 18.01.11 03:57
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>А как?

CEM>msdn about top-level window (Glossary):
CEM>

top-level window
CEM>A window that has no parent window.

CEM>Т.е. сюда же относим окна с непустым овнером?

Хм, а мне казалось, что демка по ссылке выше не оставляет шансов не разобраться, да и о проблемности GetParent там сказано...
Короче. После Win98 (т.е. с появлением GetAncestor) довольно ущербное определение top-level как "window that has no parent window" вообще утеряло всякий смысл: ну, нет таких валидных hWnd, чтобы GetAncestor(hWnd,GA_PARENT) = 0.
Так что top-level — это когда GetAncestor(hWnd,GA_PARENT) = (Get)DesktopWindow. Или менее в лоб: когда GetAncestor(hWnd,GA_ROOT) = hWnd.
К примеру, все 3 окна этой выставки старых спаевских глюков



— top-level (легко проверить через EnumWindows).
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.