Помогите!! Очень надо!!! проблемы с получением HWND Desktop
От: PavelVSokolov Россия http://www.edgebeyond.com/
Дата: 19.03.04 10:48
Оценка:
Приветсвую, знатоки!!!

Проблема следующая. Есть программка, которая меняет свойства окон. Ну так вот, я хотел-бы, что бы окно десктопа, трея и вообще все нижней строчки не менялось. Как отловить соответсвующие хеадеры.Сейчас сделано так, но не работет.

    HWND hDesktop; //Desktop
    hDesktop = ::GetDesktopWindow();

    HWND hTray1;//QuickLaunch
    hTray1 = ::FindWindow("Shell_TrayWnd",NULL);
    hTray1 = ::FindWindowEx(hTray1,NULL,"ReBarWindow32",NULL);
    hTray1 = ::FindWindowEx(hTray1,NULL,"ToolbarWindow32",NULL); 

    HWND hTray2;//Tabs
    hTray2 = ::FindWindow("Shell_TrayWnd",NULL);
    hTray2 = ::FindWindowEx(hTray2,NULL,"ReBarWindow32",NULL);
    hTray2 = ::FindWindowEx(hTray2,NULL,"SysTabControl32",NULL); 

    HWND hTray3;//Tray
    hTray3 = ::FindWindow("Shell_TrayWnd",NULL);
    hTray3 = ::FindWindowEx(hTray3,NULL,"TrayNotifyWnd",NULL);
    hTray3 = ::FindWindowEx(hTray3,NULL,"ToolbarWindow32",NULL); 

    HWND hWnd = ::GetForegroundWindow();
    if ((hWnd == hDesktop) ||
        (hWnd == hTray1) ||
        (hWnd == hTray2) ||
        (hWnd == hTray3))
        return;


пробовал так:

    HWND hDesktop; //Desktop
    hDesktop = ::FindWindow("Progman",NULL);
    hDesktop = ::FindWindowEx(hDesktop,NULL,"SHELLDLL_DefView",NULL);
    hDesktop = ::FindWindowEx(hDesktop,NULL,"SysListView32",NULL);

    HWND hTray1;//QuickLaunch
    hTray1 = ::FindWindow("Shell_TrayWnd",NULL);
    hTray1 = ::FindWindowEx(hTray1,NULL,"ReBarWindow32",NULL);
    hTray1 = ::FindWindowEx(hTray1,NULL,"ToolbarWindow32",NULL); 

    HWND hTray2;//Tabs
    hTray2 = ::FindWindow("Shell_TrayWnd",NULL);
    hTray2 = ::FindWindowEx(hTray2,NULL,"ReBarWindow32",NULL);
    hTray2 = ::FindWindowEx(hTray2,NULL,"SysTabControl32",NULL); 

    HWND hTray3;//Tray
    hTray3 = ::FindWindow("Shell_TrayWnd",NULL);
    hTray3 = ::FindWindowEx(hTray3,NULL,"TrayNotifyWnd",NULL);
    hTray3 = ::FindWindowEx(hTray3,NULL,"ToolbarWindow32",NULL); 

    HWND hWnd = ::GetForegroundWindow();
    if ((hWnd == hDesktop) ||
        (hWnd == hTray1) ||
        (hWnd == hTray2) ||
        (hWnd == hTray3))
        return;


т.е. hWnd не совпадает ни с одним из нужных мне окон, хотя применение нового стиля идет именно к нему (к рабочему столу, например) Что делать?
Just dream can be infinity.
ICQ:77405006
Re: Помогите!! Очень надо!!! проблемы с получением HWND Desk
От: GDI Россия  
Дата: 19.03.04 13:39
Оценка:
Здравствуйте, PavelVSokolov, вы писали:
[]

Ну если смотреть спаем, то порядок немного другой. Попробуй так:

HWND hDesktop; //Desktop
hDesktop = ::GetDesktopWindow();
char buf[255];
int nLen;

HWND hTray1;//QuickLaunch
hTray1 = ::FindWindow("Shell_TrayWnd",NULL);
hTray1 = ::FindWindowEx(hTray1,NULL,"ReBarWindow32",NULL);
hTray1 = ::FindWindowEx(hTray1,NULL,"ToolbarWindow32",NULL); 
nLen=::GetWindowText(hTray1, buf, 255);

HWND hTray2;//Tabs
hTray2 = ::FindWindow("Shell_TrayWnd",NULL);
hTray2 = ::FindWindowEx(hTray2,NULL,"ReBarWindow32",NULL);
hTray2 = ::FindWindowEx(hTray2,NULL,"MSTaskSwWClass",NULL);
hTray2 = ::FindWindowEx(hTray2,NULL,"ToolbarWindow32",NULL);
nLen=::GetWindowText(hTray2, buf, 255);

HWND hTray3;//Tray
hTray3 = ::FindWindow("Shell_TrayWnd",NULL);
hTray3 = ::FindWindowEx(hTray3,NULL,"TrayNotifyWnd",NULL);
hTray3 = ::FindWindowEx(hTray3,NULL,"SysPager",NULL); 
hTray3 = ::FindWindowEx(hTray3,NULL,"ToolbarWindow32",NULL);
nLen=::GetWindowText(hTray3, buf, 255);


Потом следующая "конструкция" несовсем ясна:
HWND hWnd = ::GetForegroundWindow();
if ((hWnd == hDesktop) ||(hWnd == hTray1) || (hWnd == hTray2) ||
    (hWnd == hTray3))
   return;

Для чего это нужно? В этот момент ForegroundWindow может быть и не трей или десктоп, а, например, окно твоей программы!
Re[2]: Помогите!! Очень надо!!! проблемы с получением HWND D
От: PavelVSokolov Россия http://www.edgebeyond.com/
Дата: 22.03.04 10:27
Оценка:
Здравствуйте, GDI, Вы писали:

GDI>Потом следующая "конструкция" несовсем ясна:

GDI>
GDI>HWND hWnd = ::GetForegroundWindow();
GDI>if ((hWnd == hDesktop) ||(hWnd == hTray1) || (hWnd == hTray2) ||
GDI>    (hWnd == hTray3))
GDI>   return;
GDI>

GDI>Для чего это нужно?

А нужно это чтобы прога не забота с этими окнами =) или я не правильно понял вопрос.

GDI>В этот момент ForegroundWindow может быть и не трей или десктоп, а, например, окно твоей программы!


Логично... А если перенести блок
 HWND hWnd = ::GetForegroundWindow();
в начало, то будет получше. Спасибо за замечание.

Но тем не менее, все равно ничего не работет =) Может это быть багой MFC? (хотя вызывается вункция глобального пространства )
Just dream can be infinity.
ICQ:77405006
Re[2]: Помогите!! Очень надо!!! проблемы с получением HWND D
От: PavelVSokolov Россия http://www.edgebeyond.com/
Дата: 22.03.04 10:33
Оценка:
Здравствуйте, GDI, Вы писали:

Да, еще вопрос, для чего каждый раз берется текст окна? Какая смысловая нагрузка от этого?
Just dream can be infinity.
ICQ:77405006
Re[3]: Помогите!! Очень надо!!! проблемы с получением HWND D
От: GDI Россия  
Дата: 22.03.04 12:27
Оценка:
Hello, PavelVSokolov! Вы писали:
P> Здравствуйте, GDI, Вы писали:
P> Да, еще вопрос, для чего каждый раз берется текст окна? Какая
P> смысловая нагрузка от этого?

Текст окна я брал просто так, для того, чтобы определить, правильно-ли получен хендл.

P> Но тем не менее, все равно ничего не работет =) Может это быть багой MFC? (хотя вызывается вункция глобального пространства )

А какая у тебя ОС? Может быть в WinVersion < (2000 || XP) другие оконные классы используются, но тот пример, которыя я привел — работает в WinXP так как тадо! Посмотри в Debug'е на какой строке хендл hTray1,hTray2, или hTray3 становятся равными NULL.
Posted via RSDN NNTP Server 1.8 beta
Re[4]: Помогите!! Очень надо!!! проблемы с получением HWND D
От: PavelVSokolov Россия http://www.edgebeyond.com/
Дата: 23.03.04 08:58
Оценка:
Здравствуйте, GDI, Вы писали:

GDI>Текст окна я брал просто так, для того, чтобы определить, правильно-ли получен хендл.

Ясненько. Я так и понял.

GDI>А какая у тебя ОС? Может быть в WinVersion < (2000 || XP) другие оконные классы используются, но тот пример, которыя я привел — работает в WinXP так как тадо! Посмотри в Debug'е на какой строке хендл hTray1,hTray2, или hTray3 становятся равными NULL.


Нет. Проблема в том, что полученный хендл окна не совпадает ни с одним из известных. А ОС у меня Win2k. Раньке я писалпрогу с похожим назначением, так так все работало и сейчас работет. Код я взял оттуда. Но та прога была чисто WinAPI а эта на MFC. И теперь не работет. Что же делать-то? Может по хендлу окна получать имя экзешника и далее просто сравнивать допустимо-ли оно? Как считаешь?
Just dream can be infinity.
ICQ:77405006
Re[5]: Помогите!! Очень надо!!! проблемы с получением HWND D
От: GDI Россия  
Дата: 23.03.04 09:18
Оценка:
Hello, PavelVSokolov! Вы писали:

GDI> Потом следующая "конструкция" несовсем ясна:

GDI>
 GDI> HWND hWnd = ::GetForegroundWindow();
 GDI> if ((hWnd == hDesktop) ||(hWnd == hTray1) || (hWnd == hTray2) ||
 GDI>    (hWnd == hTray3))
 GDI>   return;
 GDI>

GDI> Для чего это нужно?
P> А нужно это чтобы прога не забота с этими окнами =) или я не правильно понял вопрос.

Вот это выражение я не понял. Я позвал пару человек для разъяснения — они тоже не поняли! Это по-русски написано? Какая такая не забота?


GDI>> А какая у тебя ОС? Может быть в WinVersion < (2000 || XP) другие

GDI>> оконные классы используются, но тот пример, которыя я привел -
GDI>> работает в WinXP так как тадо! Посмотри в Debug'е на какой строке
GDI>> хендл hTray1,hTray2, или hTray3 становятся равными NULL.
P> Нет. Проблема в том, что полученный хендл окна не совпадает ни с
P> одним из известных.
Каких таких — "Известных"???? Listen — если hTray1, hTray2, hTray3 в результате не равны NULL то эти хендлы и есть то что нужно! А вот проверку ты делаешь — GetForegroundWindow — так это вообще нужно удалить!

P> А ОС у меня Win2k. Раньке я писалпрогу с похожим назначением, так так

P> все работало и сейчас работет. Код я взял оттуда. Но та прога была чисто
P> WinAPI а эта на MFC. И теперь не работет.
А при чем тут MFC? Ты-же using global scope, поэтому функции вызываются API'шные!

P> Что же делать-то? Может по хендлу окна получать имя экзешника и далее

P> просто сравнивать допустимо-ли оно? Как считаешь?
Что-за экзешник? Windows'а что-ли?
Posted via RSDN NNTP Server 1.8 beta
Re[6]: Помогите!! Очень надо!!! проблемы с получением HWND D
От: PavelVSokolov Россия http://www.edgebeyond.com/
Дата: 23.03.04 09:27
Оценка:
Здравствуйте, GDI, Вы писали:

GDI>Hello, PavelVSokolov! Вы писали:


GDI>> Потом следующая "конструкция" несовсем ясна:

GDI>>
 GDI>> HWND hWnd = ::GetForegroundWindow();
 GDI>> if ((hWnd == hDesktop) ||(hWnd == hTray1) || (hWnd == hTray2) ||
 GDI>>    (hWnd == hTray3))
 GDI>>   return;
 GDI>>

GDI>> Для чего это нужно?
P>> А нужно это чтобы прога не забота с этими окнами =) или я не правильно понял вопрос.

GDI>Вот это выражение я не понял. Я позвал пару человек для разъяснения — они тоже не поняли! Это по-русски написано? Какая такая не забота?


не забота а работа — опечатка.


GDI>>> А какая у тебя ОС? Может быть в WinVersion < (2000 || XP) другие

GDI>>> оконные классы используются, но тот пример, которыя я привел -
GDI>>> работает в WinXP так как тадо! Посмотри в Debug'е на какой строке
GDI>>> хендл hTray1,hTray2, или hTray3 становятся равными NULL.
P>> Нет. Проблема в том, что полученный хендл окна не совпадает ни с
P>> одним из известных.
GDI>Каких таких — "Известных"????
hTray1, hTray2, hTray3, hDesktop

GDI>Listen — если hTray1, hTray2, hTray3 в результате не равны NULL то эти хендлы и есть то что нужно! А вот проверку ты делаешь — GetForegroundWindow — так это вообще нужно удалить!


Ты не понял. Мне нужно отследить что бы на момент вызова данной функции ForeGround Window не было hTrayX, hDesktop. Вот потому я и беру GetForegroundWindow. Если есть другие соображения — рад буду услышать.

P>> А ОС у меня Win2k. Раньке я писалпрогу с похожим назначением, так так

P>> все работало и сейчас работет. Код я взял оттуда. Но та прога была чисто
P>> WinAPI а эта на MFC. И теперь не работет.
GDI>А при чем тут MFC? Ты-же using global scope, поэтому функции вызываются API'шные!

P>> Что же делать-то? Может по хендлу окна получать имя экзешника и далее

P>> просто сравнивать допустимо-ли оно? Как считаешь?
GDI>Что-за экзешник? Windows'а что-ли?

Нет. Для hDesktop и для hTrayX имя файла, кому принадлежат эти окна — explorer.exe. Вот по нему и проверять.
Just dream can be infinity.
ICQ:77405006
Re[7]: Помогите!! Очень надо!!! проблемы с получением HWND D
От: GDI Россия  
Дата: 23.03.04 10:24
Оценка:
Hello, PavelVSokolov! Вы писали:

P> Ты не понял. Мне нужно отследить что бы на момент вызова данной

P> функции ForeGround Window не было hTrayX, hDesktop. Вот потому я и
P> беру GetForegroundWindow. Если есть другие соображения — рад буду
P> услышать.
А-а-а-а-а, понятно. Ну а что, значит в момент выполнения твоей функции ForeGroundWindow не является этим — "Известным" окном. Если панель задач видна, то это еще не значит, какое-то из ее дочерних окон является ForeGround. ForeGround может быть сама панель задач, а не Tray или QuickLaunch.
Кстати, а что должна делать эта функция и по какому событию она вызывается?
Posted via RSDN NNTP Server 1.8 beta
Re[8]: Помогите!! Очень надо!!! проблемы с получением HWND D
От: PavelVSokolov Россия http://www.edgebeyond.com/
Дата: 29.03.04 08:01
Оценка:
Здравствуйте, GDI, Вы писали:

GDI>Hello, PavelVSokolov! Вы писали:


P>> Ты не понял. Мне нужно отследить что бы на момент вызова данной

P>> функции ForeGround Window не было hTrayX, hDesktop. Вот потому я и
P>> беру GetForegroundWindow. Если есть другие соображения — рад буду
P>> услышать.
GDI>А-а-а-а-а, понятно. Ну а что, значит в момент выполнения твоей функции ForeGroundWindow не является этим — "Известным" окном. Если панель задач видна, то это еще не значит, какое-то из ее дочерних окон является ForeGround. ForeGround может быть сама панель задач, а не Tray или QuickLaunch.
GDI>Кстати, а что должна делать эта функция и по какому событию она вызывается?

Ну суть в том, что бы убирать и восстанавливать активное окно. Вызывается она по HotKey. Вот есть свернуть все окна (Win+D), потом щеклнуть на десктоп, а потом нажать мой HotKey, то десктоп исчезает. А это не правильно... Вотю
Just dream can be infinity.
ICQ:77405006
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.