Как выполнить Perl Win32::GuiTest функции, когда пользовательский сеанс заблокирован

Я попытался выполнить приведенный ниже скрипт Perl и заблокировал сеанс пользователя...

$n=15;
while($n>0)
{
  print "$n,";
  $n--;
  sleep(1);
}

Это работало как обычно без какого-либо дополнительного кода..., Когда я заблокировал сеанс, не было никакого вывода, так как я заблокировал сеанс до следующей секунды. Вывод, увиденный, когда я разблокировал сессию:

C:\Pradeep>perl test.pl
15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,
C:\Pradeep>

Когда я запускаю приведенный ниже скрипт, который я использую для подключения к серверу с помощью функций Win32::GuiTest, таких как SetForegroundWindow($_); SendKeys("Password01"); и т. д... он подключился без проблем, и вход на сервер прошел успешно. Но, когда я блокирую сеанс в середине выполнения и разблокировал сеанс, выполнение сценария было завершено, но вход на сервер не был выполнен.

use Win32::GuiTest qw(FindWindowLike GetWindowText SetForegroundWindow SendKeys);
system('"start %windir%\system32\mstsc.exe"');    
$Win32::GuiTest::debug = 0;    
$max_Sleep_time=3;
$Cur_Sleep_time=0;
do
{
  sleep(1);    
  @windows = FindWindowLike(0, "Remote Desktop Connection");
 $number_of_windows_opend = scalar(@windows);        
  $Cur_Sleep_time++;
}while ($number_of_windows_opend==0&&$Cur_Sleep_time!=$max_Sleep_time);
for (@windows) {
  SetForegroundWindow($_);         
  SendKeys("server_name");    
  SendKeys("{ENTER}"); 
  sleep(10);
  @windows_seq = FindWindowLike(0, "Windows Security");
     for (@windows_seq)    {
      SetForegroundWindow($_);
          SendKeys("Password01");
          SendKeys("{ENTER}");
    }
@windows={};
exit;
  }

По моему мнению, я использовал активные окна для выполнения своих функций. Так что это не работает. Есть ли другой способ, которым я могу успешно выполнить вышеуказанные функции, если пользовательский сеанс заблокирован в середине процесса выполнения. или мне нужно внести изменения в мой код?

2 ответа

Решение

Вместо использования ключей отправки используйте WMSetText(); функция. Он принимает окно / элемент управления HWND и текст в качестве входных данных и устанавливает текст для указанного объекта.

Примечание. Использование WMSetText(); Вы можете просто установить текст, вы не можете отправлять ключи, такие как {ENTER},{F1} и т. д...

Вам уже сказали ответ несколько раз:

  1. http://perlmonks.org/?node_id=1073507
  2. http://perlmonks.org/?node_id=1073302
  3. http://perlmonks.org/?node_id=1073530

Это объясняется в документации Win32:: GuiTest. По понятным причинам безопасности вы не можете отправлять ключи приложениям, когда экран заблокирован, вы не можете отправлять ключи приложениям, которые не активны.

Другие вопросы по тегам