Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В программе SendMessage не работает под Windows 7, Delphi 7 и Windows 7 
:(
    Опции темы
ДЫМ
Дата 25.11.2012, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 6.1.2004

Репутация: 8
Всего: 8



Уважаемые коллеги, требуется ваш совет.

Я писал программу, когда у меня стояла Windows XP. Теперь у меня стоит Windows 7.  Delphi 7 я поставил в Windows 7 внес в мою старую программу нужные мне изменения и откомпилировал заново. Чтобы было понятно, расскажу что делает программка. После запуска моя программка запускает стороннюю программу посредством CreateProcess. Вот в этой запущенной программе мне надо нажать программно кнопку [Сохранить]. Я получаю дескриптор кнопки и посылаю сообщение кнопке (нажатие левой кнопки мыши). Так вот, кнопка не нажимается, однако если моей прогамме установить совместимость с Win XP, то все работает и кнопка нажимается, причем в IDE Delphi по нажатию F9 программка компилируется, запускается и все нормально, кнопка нажимается. Но если убрать совместимость самого Delphi с Win XP, то кнопка перестает нажиматься. Все остальное в программе работает как надо. Я думал, что проблема в SendMessage, попробовал сделать через SendInput, картина такая же, кнопка нажимается только в режиме совместимости с Win XP. Неужели ничего нельзя сделать? Только не предлагайте установить Delphi 2010, там мою программу надо переделывать основательно, читать документацию по новой среде, я пробовал, но решил такой вариант оставить на случай, когда больше уже ничего не поможет. Может быть кто-нибудь сталкивался с подобными проблемами совместимости? 
Вот фрагмент кода, который не работает в Win 7 и работает в Win XP.

Код

procedure PressEnter;
var K: array [0..1] of TInput; 
begin
  ZeroMemory(@K, SizeOf(TInput)*2); 
  K[0].Itype := INPUT_KEYBOARD; 
  K[0].ki.wVk := VK_RETURN; 
  K[1].Itype := INPUT_KEYBOARD;
  K[1].ki.wVk := VK_RETURN;
  K[1].ki.dwFlags := KEYEVENTF_KEYUP; 
  SendInput(2,K[0],SizeOf(TInput)); 
end;

...

CreateProcess(
     nil,
     PChar( fcGetDir(dirTemp)+sNameFile ),  
     nil, nil, False,
    NORMAL_PRIORITY_CLASS, nil, nil,
    si, pi);

    WaitForInputIdle(pi.hProcess, INFINITE); 
//    Sleep(100);
    EnumThreadWindows(pi.dwThreadId, @EnumThrWndProc, 0);


    SetForegroundWindow(MainHandle);
    wndbutton := FindWindowEx(MainHandle, 0, nil, 'Сохранить');

   // вариант с отправкой сообщения

    PostMessage(wndbutton,WM_LBUTTONDOWN,0,0);

    PostMessage(wndbutton,WM_LBUTTONUP,0,0);


  // вариант с SendInput
  PressEnter;




Это сообщение отредактировал(а) ДЫМ - 25.11.2012, 22:04
PM MAIL WWW   Вверх
kami
Дата 25.11.2012, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Приложение, запускаемое через CreateProcess требует повышения прав?
Где анализ того, что вернуло PostMessage и SendInput?

UPD: в следующий раз не знаю, когда появлюсь, посему небольшие пояснения:
по поводу повышения прав: отправка сообщения другому процессу возможна, если этот "другой процесс" имеет IntegrityLevel (грубо говоря - права) равные, или меньше, чем процесс, вызывающий SendMessage. То есть, если в Win7 запустить свое приложение с обычными правами, то оно не сможет отправить сообщение (в том числе - SendInput) в другое приложение, запущенное "от администратора".

по поводу анализа: должно быть что-то типа
Код

res := PostMessage(...);
if res = 0 then
  raiseLastOSError;

И на основании этого уже смотреть, что и как.

UPD2: Читать ремарки в MSDN к функциям PostMessage и SendInput. Ну и значение, возвращаемое CreateProcess не помешает проверять до кучи.

Это сообщение отредактировал(а) kami - 25.11.2012, 22:51
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0742 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.