MVV

|
Posted: Sun Apr 18, 2010 10:24 Post subject: |
|
|
VadiMGP wrote: | Я детально не штудировал твой пример, но две проблемы сразу заметны. Они касаются листбоксов (mylb1 и mylb2). |
Что ж, я не давал клятву, что он идеален.
VadiMGP wrote: | 1. Ты исходишь из предположения, что в ТС всегда 2 листбокса. Но это не так. Окна с деревьями тоже листбоксы, значит в разное время может быть от 2 до 4 листбоксов. |
Да, действительно. Но я заметил, что у листбоксов деревьев имя текст окна не пуст, значит, можно искать окна файловых панелей по пустому тексту. Тогда в моем примере надо чуть изменить (указать не любой, а пустой текст окна при поиске):
Code: | mylb1=FindWindowEx(hMainWnd, 0, L"TMyListBox", L"");
mylb2=FindWindowEx(hMainWnd, mylb1, L"TMyListBox", L""); |
Так мы гарантированно найдем окна панелей. Кстати, по идее можно просто брать активное окно, а не искать их - оно будет листбоксом при щелчке мышью и нажатии клавиш в интересующий нас момент.
VadiMGP wrote: | 2. Ты берешь HWND от них только один раз при инициализации. Но ТС часто уничтожает и создает листбоксы динамически. Например при переключении между режимами (подробный, эскизы, пользовательские колонки). |
Подтверждаю. Тоже не учел. В таком случае нужно либо искать окна панелей каждый раз (два окна найти - не проблема), а можно просто использовать указанный выше фокус. То есть, вызываем GetFocus(), и если окно с фокусом - TMyListBox, значит, берем из него индекс и т.д. Панель состояния в любом случае не изменяется.
Итак, убираем дескрипторы mylb1, mylb2 и их поиск, а функцию GetActivePanel модифицируем следующим образом:
Code: | HWND GetActivePanel() {
HWND hwnd=GetFocus();
wchar_t buf[256];
if (!GetClassName(hwnd, buf, TSIZE(buf)) || lstrcmp(buf, L"TMyListBox")) return 0;
if (GetWindowText(hwnd, buf, TSIZE(buf)) || GetLastError()) return 0;
return hwnd;
} |
Ну а в хук-функциях проверять, не ноль ли дескриптор окна - если ноль, ниче не делать. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|