![]() |
eXeL@B —› Вопросы новичков —› как ломать exel |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 21 июля 2006 23:05 · Личное сообщение · #1 Привет всем. Вот теперь у меня еще и такой вопрос назрел. Как получить доступ к ячейкам exelя? Если послать сообщение нажатия мышки в конкретную точку окна я могу (и выделится соответствующая ячейка), то слать текст в какую-то ячейку, а тем более считывать из ячейки я не знаю как. Пробовал WM_GETTEXT - не помогает ![]() Только обязательно нужно обойтись средствами winapi. Я знаю, что для каждой проги бывают свои средства. Например, для IE это функция ShellExecute Но дело в том, что такие вот "неадресуемые" ячейки встречаются не только в exel, и что делать с ними - совершенно не ясно. PS Заранее извиняюсь, если была такая тема. Дайте тогда ссылку, плиз. Вроде поиск поюзал, но не нашел ничего удобоваримого. ![]() |
|
Создано: 21 июля 2006 23:24 · Личное сообщение · #2 |
|
Создано: 21 июля 2006 23:32 · Личное сообщение · #3 |
|
Создано: 21 июля 2006 23:46 · Личное сообщение · #4 |
|
Создано: 22 июля 2006 00:01 · Личное сообщение · #5 |
|
Создано: 22 июля 2006 00:08 · Поправил: Obsession · Личное сообщение · #6 Не, ну понимаешь, для стандартных комбобоксов - да, SendMessage Но если spy++ выделяет только главное основное окно, а все остальное, что на нем есть - не выделяет. Что тогда делать? Ячейка - это я имел в виду как раз exeleвские ячейки. Те, что в VBA называются .Cells(,) Вот, я все-таки выковырял в инете похожую проблему. prog-gate.pp.ru/fido7.ru.programming.languages/1365.html Именно "копнуть поглубже" туда, в окно. Но там к сожалению не написано решение. На других сайтах для exelя все предлагают кучу каких-то драйверов. Нет ли какого-то общего решения? ![]() |
|
Создано: 22 июля 2006 00:55 · Личное сообщение · #7 |
|
Создано: 22 июля 2006 01:28 · Поправил: Demon666 · Личное сообщение · #8 |
|
Создано: 22 июля 2006 01:40 · Личное сообщение · #9 |
|
Создано: 22 июля 2006 01:48 · Личное сообщение · #10 |
|
Создано: 22 июля 2006 01:59 · Личное сообщение · #11 Черт побери, огромное спасибо, действительно получилось!!!!!!!!! Жму руку! ![]() Блин, а ведь так и не догадаешься. Сейчас уже хотел пробовать по координатам искать(у меня есть в запасе специальный класс) Ну спасибо, я сдвинулся с мертвой точки, пойду дальше делать. Всем, кто мне пытался помочь, - тоже спасибо ![]() ![]() |
|
Создано: 22 июля 2006 15:50 · Личное сообщение · #12 Obsession пишет: Кстати, что такое su.win32.prog? Давным-давно, когда HTTP еще не было, информацию распространяли через ньюс-группы(newsgroup). Они имели иерархическую структуру : su- Советский Союз, win32.prog - программирование для win32. Эти ньюсы существуют до сих пор, но мы же летаем на ракетах и лошади нам ни к чему ![]() ![]() |
|
Создано: 23 июля 2006 03:07 · Поправил: Obsession · Личное сообщение · #13 tundra37 На счет su.win32.prog - понятно ) Теперь у меня такая беда. Смотрю в ячейку через InqSoft, в тексте окна пусто ("") Меняю содержимое ячейки (пробовал так и так): SendMessage(cell,WM_SETTEXT,0 ,(LPARAM)"text"); SetWindowText(cell,"text"); В результате в ячейке все равно пусто, зато у всех ячеек(т.е. у любой просмотренной ячейки) в тексте окна написано "text" Аналогично для считывания: SendMessage(cell,WM_GETTEXT,(WPARAM)25,(LPARAM)str); GetWindowText(cell,str,255); Считывает пустоту,т.е. "", если же пробовал менять текст ячейки, считывает "text",т.е. из, условно говоря, "заголовка" ячейки, а не самой ячейки. Как это лечится? PS После нескольких запусков GetText компьютер наглухо зависает ![]() ![]() |
|
Создано: 23 июля 2006 04:18 · Личное сообщение · #14 Obsession пишет: Если послать сообщение нажатия мышки в конкретную точку окна я могу (и выделится соответствующая ячейка) Obsession Возьми, активируй ячейку и с поля fx, (что находится над таблицей с ячейками, и в которой редактируются данные ячейки) попробуй оттуда данные снять или уже пробовал так делать? ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com ![]() |
|
Создано: 23 июля 2006 10:17 · Личное сообщение · #15 Obsession Любит же народ себе проблемы создавать. Если бы в Excel каждая ячейка обрабатывала бы события, то в нем бы работать было невозможно. Поэтому вместо того, чтобы бороться с трудностями, найди функции для работы с таблицами Excel. Например в Дельфи есть компоненты. В конце концов даже через Вижуал Бейсик проще работать, чем разбираться кому и что надо послать, чтобы ячейку изменить. ![]() |
|
Создано: 23 июля 2006 20:05 · Поправил: Obsession · Личное сообщение · #16 Demon666 пишет: Obsession Возьми, активируй ячейку и с поля fx, (что находится над таблицей с ячейками, и в которой редактируются данные ячейки) попробуй оттуда данные снять или уже пробовал так делать? InqSoft не видит там текста, даже если что-нибудь там написано, так что, я думаю, нет смысла пробовать. tundra37 пишет: Obsession Любит же народ себе проблемы создавать. Если бы в Excel каждая ячейка обрабатывала бы события, то в нем бы работать было невозможно. А почему невозможно? tundra37 пишет: Поэтому вместо того, чтобы бороться с трудностями, найди функции для работы с таблицами Excel. Например в Дельфи есть компоненты. В конце концов даже через Вижуал Бейсик проще работать, чем разбираться кому и что надо послать, чтобы ячейку изменить. Никогда не слышал об этих функциях. Надо попробовать. Не понятно все же, почему не действуют обычные функции API . Согласен, это похоже на создание лишних проблем, но просто я подбираюсь к другой программе, которой даже нет у меня на компе. А в этом они похожи с exelем: у них обеих такие необрабатываемые окна. И я хотел выяснить, что с этими окнами не так. Как в exele, так и в той проге. А подскажите тогда, почему комп виснет после GetText. Как правильно считывать текст? ![]() |
|
Создано: 24 июля 2006 13:13 · Личное сообщение · #17 Obsession Пардон конечно за оффтоп, но вспомнился анекдот. Там мужик искал пропажу не там, где потерял, а там, где светло. Твоя ситуация похожая. Даже если ты научишься Excel-ем управлять через события или через API, это мало чем поможет тебе с другой программой. Микрософт специально реализовал несколько механизмов для работы с Excel извне. Один из них DDE. Наверняка что-то описано в MSDN. Попытка использовать механизм сообщений обречена на провал без изучения кухни Микрософт. Если тебя устраивает работа с той "другой программой" вслепую, то это самый правильный путь. Все API, какие тебе для этого нужны : просмотр списка окон и посылка им сообщений. В InqSoft я что-то не нашел возможности протоколировать сообщения. В spy++ это есть, сообщения действительно WM_GETTEXT, но много шансов за то, что сам текст передается внутри самого Excel или через другое окно(там их масса) или через API. В MSO9.dll более тысячи входов, к сожалению там ординалы. Возможно там твои API и сидят. Но MSO9 для другой программы мало чем поможет ![]() ![]() |
|
Создано: 11 августа 2006 22:27 · Личное сообщение · #18 Меня давно не было. Но я раздобыл ту прогу и даже пытался ее поломать немного дома. Я ее выложить не могу, она 10мб (ехешник и dllины). Но я выяснил следующие вещи: 1)Одно окошко, которое мне перво-наперво нужно, в нем есть поля ввода(как обычные окна класса TEdit). InqSoft "видит" только это окошко, а все что есть на нем(поля ввода и кнопки) не видит. Пробовал делать перебор детей следующей процедурой: BOOL CALLBACK WinProc(HWND wh,LPARAM lParam) { //выводит в memo все окна char wn[256]; if(lParam)return 1; GetWindowText(wh,wn,256); Form1->Memo1->Text=Form1->Memo1->Text+wn; return 1; } void __fastcall TForm1::Button1Click(TObject *Sender) { int A=(StrToInt("0x"+Form1->Edit1->Text)); EnumChildWindows((HWND)A,(WNDENUMPROC)WinProc,0); } Детей нет(я эту процедуру откуда-то содрал, как раз, когда начинал осваивать функции Winapi, она работает правильно, я проверял) А spy++ не видит даже этого окошка. Видит только главное окно программы. 2)Dll-ины имеют следующие названия: Vfp6r.dll Vfp6renu.dll Vfp6t.dll Я где-то прочитал, что такие библиотеки вроде как раз используются против уязвимости windows к сообщениям. Что, типа, нет никакого editboxа, есть белая полоска и мигающий курсор:все просто нарисованно. Соответственно, пытаться добраться до этого окна - все равно, что пытаться открыть нарисованную дверь. Пробовал слать сообщения о нажатии клавиш таким кодом: HWND poisk;//хэндл окна поиск SendMessage(poisk,WM_LBUTTONDOWN,0,MAKELPARAM(74,21)); SendMessage(poisk,WM_LBUTTONUP,0,MAKELPARAM(74,21)); SendMessage(poisk,WM_SETFOCUS,0,0); char key='f'; SendMessage(poisk,WM_KEYDOWN,key,0); //SendMessage(poisk,WM_CHAR,key,0);// так тоже пробовал - не работает SendMessage(poisk,WM_KEYUP,key,0); Так вот, может есть какие-то способы борьбы с этим? (о таблицах типа stringgrid(или как они правильно называются: listboxы, кажется), которые там присутствуют, я уже даже и не мечтаю. Мне хотяб это доделать раз взялся) Сообщения от spy++ я, честно говоря, не понял, как ловить. Надо копать в эту сторону? Кому еще не надоела эта тема, пожалуйста, выскажитесь, что вы об этом думаете. ![]() |
|
Создано: 12 августа 2006 11:14 · Личное сообщение · #19 Obsession пишет: Vfp6r.dll Vfp6renu.dll Vfp6t.dll Я где-то прочитал Да любой поиск даст, что это - VFP - Visual Fox Pro. Вообще-то странно, я считал что все Вижуалы построены одинаково. Возможно, что для совместимости со старыми версиями в Фоксе все сделано на битмапах и внутренних механизмах. Короче - есть декомпиляторы Фокса, есть куча форумов - читай,спрашивай и ломай не хочу. И Эксель совсем здесь лишний был. На будущее запомни : самое главное в краке понять, что за враг, а не пытаться его сразу взорвать, да еще тренироваться черт-те на чем ![]() ![]() |
|
Создано: 12 августа 2006 17:43 · Личное сообщение · #20 |
|
Создано: 12 августа 2006 21:01 · Личное сообщение · #21 |
|
Создано: 12 августа 2006 21:48 · Личное сообщение · #22 |
|
Создано: 12 августа 2006 22:40 · Личное сообщение · #23 Уммм, это 2 куска из двух разных программ. Первый кусок из программы на 3м билдере, которая выводит в memo названия всех дочерних окон окна, хэндл которого введешь. А второй кусок - тоже 3й билдер. Это я уже пытался писать резидентную программу для той проги, которая на фоксе. И я не очень понял, как это без debug информации. Вернее, как с debug информацией? Дело в том, что при отладке создается "маленький", условно говоря, exeшник. На компе, на котором не установлен этот самый пресловутый 3й билдер(или выше, наверное), этот файл не запустится. Меня, в принципе, научили делать "независимый" ехешник(там с подключением или наоборот отключением использования всяких runtime модулей, библиотек и т.д., я особо не разбирался), он запустится, но он будет большой. Поскольку использование разных формочек, этот GUI занимает все место,то он будет больше 1мб наверное. В общем, это я все к тому, ![]() скажи, что тебе конкретно нужно. ![]() |
|
Создано: 12 августа 2006 23:26 · Личное сообщение · #24 Obsession Вот состряпал функцию: void SetTextInExel(char* string, POINT p) { //p = (74,21) HWND h = WindowFromPoint(p); SendMessage(h,WM_LBUTTONDOWN,0,MAKELPARAM(p.x,p.y)); SendMessage(h,WM_LBUTTONUP,0,MAKELPARAM(p.x,p.y)); h = WindowFromPoint(p); SendMessage(h,WM_SETTEXT,0,string); SendMessage(h,WM_KEYDOWN,VK_RETURN,0); } хз работает ли она, но теоретически должна. =) ЗЫ: было бы хорошо если бы ты отвечал на вопросы. ![]() |
|
Создано: 13 августа 2006 00:05 · Личное сообщение · #25 rep0A пишет: было бы хорошо если бы ты отвечал на вопросы. сорри, извини пожалуйста, я случайно пропустил rep0A пишет: Obsession пишет: SendMessage(poisk,WM_LBUTTONDOWN,0,MAKELPARAM(74,21)); SendMessage(poisk,WM_LBUTTONUP,0,MAKELPARAM(74,21)); SendMessage(poisk,WM_SETFOCUS,0,0); Вот после этого окно для ввода появляется? Да, можно даже без WM_SETFOCUS rep0A пишет: Вот состряпал функцию: Большое спасибо! Сейчас попробую! ![]() |
|
Создано: 13 августа 2006 01:41 · Личное сообщение · #26 Obsession пишет: Первый кусок из программы на 3м билдере, которая выводит в memo названия всех дочерних окон окна, хэндл которого введешь. Угу, это и имел ввиду. Obsession пишет: Вернее, как с debug информацией? Ладно, проехали, просто с этим возни больше будет. Obsession пишет: скажи, что тебе конкретно нужно. Конкретно коллекционирую варианты в своем “шпиЁне” то, что другие проги не могут делать, так на скидку подумал, вдруг придется столкнуться с такой проблемой как у тебя ну и попутно добавить такой вариант с “рисованными окнами”. Вообще есть идея, но нужно полностью быть уверенным, чтобы потом констатировать факты. (Пока буду юзать Excel) Ну и так для примера, возьми InqSoft и наведи на toolbar в Olly, это сразу наводит на мысль что присутствует вариант WM_PAINT. (я не проверял, но предстоит, пока воюю с регионами (WM_NCPAINT), но это не важно.) ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com ![]() |
|
Создано: 13 августа 2006 01:47 · Поправил: Obsession · Личное сообщение · #27 rep0A пишет: Вот состряпал функцию: Ну кстати грамотнее было бы так: POINT p = (498,426); HWND h = WindowFromPoint(p); SendMessage(h,WM_LBUTTONDOWN,0,MAKELPARAM(74,21)); SendMessage(h,WM_LBUTTONUP,0,MAKELPARAM(74,21)); либо SendMessage(NULL,WM_LBUTTONDOWN,0,MAKELPARAM(p.x,p.y)); SendMessage(NULL,WM_LBUTTONUP,0,MAKELPARAM(p.x,p.y)); поскольку координаты, если указывать хэндл окна, определяются для этого окна(клиентские,по-моему, как показывает InqSoft) ,а не для экрана. Но все равно не работает. В h записывается хэндл именно окна поиска, а не контрола ввода, который на этом окне поиска находится(и должен бы был быть ребенком) А окну поиска что-то слать - ясное дело нет смысла. Я прочитал (кстати вот форум по VFP если у кого тоже будут проблемы forum.foxclub.ru ), что в VFP вовсе не все контролы - это окна. Ну еще фишка могла бы быть в том, что туда можно вписать только русские буквы(даже цифры нельзя) я уж по-разному изощрялся: и так: char string='л'; SendMessage(h,WM_SETTEXT,0,string); SendMessage(h,WM_KEYDOWN,VK_RETURN,0); и так: long string='л'; SendMessage(h,WM_SETTEXT,0,string); SendMessage(h,WM_KEYDOWN,VK_RETURN,0); и так(для пробы): char string='q'; SendMessage(h,WM_SETTEXT,0,string); SendMessage(h,WM_KEYDOWN,VK_RETURN,0); но бесполезно. Можно что-то вписать, если курсор мигает. А в результате отработки резидентной программы появляется только синяя полоса(как будто выделили пустое место), и ничего не мигает. Я уже читаю тот форум, вроде есть там какой-то способ. Но все равно спасибо еще раз. ![]() |
|
Создано: 13 августа 2006 02:04 · Поправил: Obsession · Личное сообщение · #28 Demon666 пишет: Ну и так для примера, возьми InqSoft и наведи на toolbar в Olly, это сразу наводит на мысль что присутствует вариант WM_PAINT. (я не проверял, но предстоит, пока воюю с регионами (WM_NCPAINT), но это не важно.) Я пока не игрался с Olly и т.д. (софтайс только пробовал, но мои познания в ассемблере не велики(мягко говоря), поэтому я его удалил. Сейчас разбираться с ним не буду точно) ну ты олю для примера просто привел, да? Единственное, что интересно, InqSoft ловит окошко поиска в фоксовской проге, а spy++ нет. На счет той проги - она ловит только действительно существующие окна, у которых есть хэндл. Всякие "нарисованные двери" она не ловит. Если хочешь, прикреплю проект с "маленьким" ехешником. ![]() |
|
Создано: 13 августа 2006 02:25 · Личное сообщение · #29 Че-то не то с форумом: файл не получается заменить. А редактировать можно только через 4 минуты, хотя написано, что через 4 секунды ![]() ![]() ![]() |
|
Создано: 13 августа 2006 10:41 · Поправил: tundra37 · Личное сообщение · #30 Ребята !! Куда вас несет ?! Ну давайте, я сейчас распакую BC5.2 или даже 5.0 , сделаю проект и вы все дружно будете разбираться, как в прошлом веке программировали Edit-ы. Просто там другие API и все. Вопроса как такового нет. Тов. Obsession сначала берет Excel, потом Фокс-6, потом Билдер 3-й. Все-таки в одной теме нельзя разбирать вселенскую проблему : "Как программировали окна с 1992 года по 2006-й". Все проблемы, поднятые Obsession, уже давно задокументированы, но каждый в своем месте. Obsession пишет: childrenofhandle.zip Ты ее слинковал неправильно, без библиотек посмотреть нельзя. ![]() |
. 1 . 2 . >> |
![]() |
eXeL@B —› Вопросы новичков —› как ломать exel |