Как выполнить 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} и т. д...
Вам уже сказали ответ несколько раз:
- http://perlmonks.org/?node_id=1073507
- http://perlmonks.org/?node_id=1073302
- http://perlmonks.org/?node_id=1073530
Это объясняется в документации Win32:: GuiTest. По понятным причинам безопасности вы не можете отправлять ключи приложениям, когда экран заблокирован, вы не можете отправлять ключи приложениям, которые не активны.