Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Windows.GetWindow и GetWindowText = нет заголовков


Автор: Delvish 24.5.2014, 23:14
Всем доброй ночи и других времен суток.

Есть такая функция 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;

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

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

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

случайно не сервис?

Автор: Delvish 25.5.2014, 15:51
Нет, не сервис. Обычный Application. Будучи запущенным руками от текущего пользователя, видит заголовки окон, делает нормальный скриншот и выполняет некоторые другие функции. Будучи запущенным планировщиком задач от имени Системы, не хочет выполнять вышеописанных функций. С чем это связано - мне не понятно и хотелось бы узнать, а так же узнать возможные пути решения проблемы.

Автор: Delvish 26.5.2014, 15:17
Все же откопал информацию о том, что у пользователя Система свои рабочий стол и WinSta и весьма проблематично переключаться с защищенного рабочего стола на пользовательский. Отсюда вытекает, что мне "проще" запускать программу от имени Администратора. Но тут такое "но" подкралось: в планировщике при создании задачи по умолчанию выставляется пункт "Выполнять только для зарегистрированного пользователя", а у меня все пользователи сидят под ограниченными учетками, соответственно, запуск программы по расписанию не состоится, ибо Админ не залогинен. Как же быть? Сделать сервис, запускающийся с правами системы (что даст отвязку от залогиненного пользователя) и он уже будет запускать основную программу, но с правами пользователя/администратора? Но как тогда это сделать - запуск с пониженными правами?

Автор: Delvish 26.5.2014, 22:45
Как говорится, сам спросил - сам ответил 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;


И тогда первое приложение, стартовавшее от имени системы, запустит второе, но уже с правами текущего пользователя

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)