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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Windows.GetWindow и GetWindowText = нет заголовков 
V
    Опции темы
Delvish
Дата 24.5.2014, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


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

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



Всем доброй ночи и других времен суток.

Есть такая функция GetWindow, при помощи которой я получаю хэндл первого попавшегося окна (Application.Handle, gw_HWNDfirst), так?. После, перечислением всех остальных окон (gw_HWNDnext) получаю хэндлы остальных [видимых] окон, выбирая из них через GetWindowText их заголовки. И все бы было здОрово, если бы программа работала с правами текущего пользователя. В силу обстоятельств, необходимо запускать ее с правами System, и вот тогда происходит беда - не определяются заголовки окон. И беда косвенная - при попытке сделать скриншот сохраняется ровное белое поле. Как будто права системы не позволяют видеть окна (ну бред же ведь?). Натолкните на правильную мысль, пожалуйста. Гугл не спасает.
ОС Windows 7
IDE Delphi 7

Код

function GetWinHead : String;
var wnd: hwnd;
      buff: array [0..127] of char;
begin
wnd := GetWindow(Application.Handle, gw_hwndfirst);
while wnd <> 0 do
  begin
  if (wnd <> Application.Handle) and
  IsWindowVisible(wnd) and
  (GetWindow(wnd, gw_owner) = 0) and
  (GetWindowText(wnd, buff, SizeOf(buff)) <> 0) then
    begin
    GetWindowText(wnd, buff, SizeOf(buff));
    result := result + StrPas(buff) + #13;
    end;
  wnd := GetWindow(wnd, gw_hwndnext);
  end;
end;

PM MAIL   Вверх
Akella
Дата 25.5.2014, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Цитата(Delvish @  24.5.2014,  23:14 Найти цитируемый пост)
я получаю хэндл первого попавшегося окна

не совсем так
почитай про z-последовательность

Добавлено через 1 минуту и 13 секунд
Цитата(Delvish @  24.5.2014,  23:14 Найти цитируемый пост)
 необходимо запускать ее с правами System

случайно не сервис?
PM MAIL   Вверх
Delvish
Дата 25.5.2014, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


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

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



Нет, не сервис. Обычный Application. Будучи запущенным руками от текущего пользователя, видит заголовки окон, делает нормальный скриншот и выполняет некоторые другие функции. Будучи запущенным планировщиком задач от имени Системы, не хочет выполнять вышеописанных функций. С чем это связано - мне не понятно и хотелось бы узнать, а так же узнать возможные пути решения проблемы.
PM MAIL   Вверх
Delvish
Дата 26.5.2014, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


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

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



Все же откопал информацию о том, что у пользователя Система свои рабочий стол и WinSta и весьма проблематично переключаться с защищенного рабочего стола на пользовательский. Отсюда вытекает, что мне "проще" запускать программу от имени Администратора. Но тут такое "но" подкралось: в планировщике при создании задачи по умолчанию выставляется пункт "Выполнять только для зарегистрированного пользователя", а у меня все пользователи сидят под ограниченными учетками, соответственно, запуск программы по расписанию не состоится, ибо Админ не залогинен. Как же быть? Сделать сервис, запускающийся с правами системы (что даст отвязку от залогиненного пользователя) и он уже будет запускать основную программу, но с правами пользователя/администратора? Но как тогда это сделать - запуск с пониженными правами?
PM MAIL   Вверх
Delvish
Дата 26.5.2014, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


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

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



Как говорится, сам спросил - сам ответил smile
С пониженными правами запускать нужно так:

Код

function WTSQueryUserToken(SessionId : DWORD; phToken: pHandle) : bool; stdcall; external 'wtsapi32.dll';
function WTSGetActiveConsoleSessionId : DWORD; stdcall; external 'kernel32.dll';

//===================================//
procedure RunApp(FilePath : string);
var
   hToken : THandle;
   si     : STARTUPINFO;
   pi     : PROCESS_INFORMATION;
begin
   if WTSQueryUserToken(WtsGetActiveConsoleSessionID, @hToken) then
     begin
       ZeroMemory(@si, SizeOf(si));
       si.cb := SizeOf(si);
       si.lpDesktop := nil;
       CreateProcessAsUser(hToken, nil, PAnsiChar(FilePath), nil, nil, False, 0, nil, nil, si, pi);
       CloseHandle(hToken);
     end;
end;


И тогда первое приложение, стартовавшее от имени системы, запустит второе, но уже с правами текущего пользователя
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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