![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
срочно нужен совет спеца! [D5, WinME, Win2k]
garik © (2002-03-16 04:48:00)Уважаемый спец, помогите пожалуйста разобраться с задачей:
НУЖНО ВЗЯТЬ ПУТЬ С ОТКРЫТОГО В ДАННЫЙ МОМЕНТ ДИАЛОГА (open/save as dialog)
Сообщение которое это делает, я нашёл – CDM_GETFOLDERPATH
SENDMESSAGE (хендл диалога open/save as dialog, CDM_GETFOLDERPATH,sizeof( переменная которая получит путь), указатель на переменную, которая получит путь).
И я пишу в своей проге:
Чтобы не усложнять ситуацию различными хуками, события отслеживания открытия диалогов и взятия с них пути, будут происходить по таймеру:
procedure TForm1.Timer1Timer(Sender: TObject);
Var
A:HWND; hh:integer;
zz:array [0 .. max_path] of char;
BEGIN
a:=findwindow(pchar("#32770"),nil); IF A>0 THEN BEGIN
hh:=SendMessage (a,cdm_getfolderpath,sizeof(zz),integer(@zz));
Label1.caption: =zz; Label2.caption: =inttostr(hh);
END; END;
Пусть по button1.click открывается opendialog1 (opendialog1.execute)
Выше приведенный код говорит о том, что всякий раз, когда срабатывает таймер, происходит следующее:
1. ищется в памяти диалог (без заголовка)
2. если найдено, то посылается сообщение диалогу
3. заполнение переменной zz-путём, взятого с диалога, а в переменную hh передаётся размер взятого пути
НО ВОТ КАКАЯ ИНТЕРЕСНАЯ ВЕЩЬ ПРОИСХОДИТ:
ЕСЛИ ОТКРЫВАЕТСЯ OPENDIALOG1 , ТО ВСЁ НОРМАЛЬНО: В ПЕРЕМ ZZ ПЕРЕДАЕТСЯ ПУТЬ, А В ПЕРЕМЕННУЮ HH РАЗМЕР
А ВОТ ЕСЛИ ОТКРЫВАЕТСЯ ЛЮБОЕ ДРУГОЕ ДИАЛОГОВОЕ ОКНО open/save as dialog, ТО ПЕРЕМЕННАЯ ZZ ЛИБО ПУСТА, ЛИБО СОДЕРЖИТ НЕМНОГОЧИСЛЕННЫЕ КАРАКУЛИ, А ПЕРЕМЕННАЯ HH ПОПЕРЖНЕМУ ПОЛУЧАЕТ РАЗМЕР ВЗЯТОГО ПУТИ.
Не могу понять, в чём причина такого глюка????????
В MSDN ничего такого не говорится.
Буду ВАМ очень признателен, если ВЫ проверите на работоспособность приведенный мною код и объясните мне в чем дело и как сделать так чтобы работало для всех диалоговых окон.
Надеюсь на ВАШ опыт и знания
МОЙ: STAINER@MAIL.RU
ЗАРАНЕЕ БЛАГОДАРЕН
VuDZ (2002-03-17 12:34:00) [1]
int main(int argc, char* argv[])
{
HWND hNote = FindWindow(NULL, "Open");
WPARAM wp = MAX_PATH;
LPARAM lp = (LPARAM)new char[MAX_PATH];
ZeroMemory((void*)lp, MAX_PATH);
GetClassName(hNote, lp, wp); // must be 32770
int copied;
//1
CommDlg_OpenSave_GetFolderPath(hNote, wp, lp);
//2
if ((copied = SendMessage(hNote, CDM_GETFOLDERPATH, wp, lp)) > 0)
{
printf((const char*)lp);
wprintf(L"%s", (const short*)lp);
}
return 0;
}
рабочий код, за тем исключением, что он ничего не получает... хотя честно возвращется, что скопировано 8 байт (E:\Webs+"0" == 8), но ничего не копирует...
garik (2002-03-17 12:17:00) [2]> Cobalt
Напиш ответ ещё раз, пожалуйста! очень нужно!
> VuDZ что такое IPR? И ПРИЧЁМ ЗВЕСЬ ХУКИ, ВЕДЬ Я ЖЕ ПОСЫЛАЮ МЕССАГУ ИЗВЕСТНОМУ МНЕ ДИАЛОГУ? А ЕСЛИ И ПРИТОМ, ТО МОЖНОЛИ ПО КОНКРЕТНЕЙ, КАКОЙ ХУК И КАК ЕГО СТАВИТЬ???
VuDZ (2002-03-16 12:34:00) [3]я ты Юзий Золотов? :>
VuDZ (2002-03-16 12:34:00) [4]я ты Юрий Золотов? :>
Cobalt (2002-03-16 12:26:00) [5]> Модератор
Позвольте, я же вчера отвечал на вопрос, и даже полюбовался на него;)
А нонче его уже нет :((
VuDZ (2002-03-16 07:28:00) [6]из-за IPR ничего не выйдет, юзай хуки