Какой простой способ программного моделирования пользовательского ввода? - PullRequest
4 голосов
/ 11 октября 2011

У меня есть диалоговое окно, которое появляется в результате ошибки.Я хочу, чтобы диалоговое окно оставалось открытым не менее 30 секунд и закрывалось через 30 секунд после получения последнего пользовательского ввода (мышь или клавиатура).

Я могу реализовать это, проверив значение, возвращаемое GetLastInputInfo, и закрывдиалоговое окно, если это более 30 секунд назад, но если диалоговое окно появляется, когда пользователь не находился у мыши или клавиатуры в течение 30 секунд, тест GetLastInputInfo сразу же проходит, и диалоговое окно немедленно закрывается.Я мог бы сделать это с другим таймером, но я полагаю, что было бы намного проще имитировать перемещение мыши или нажатие (безвредное) нажатия клавиш непосредственно перед открытием диалога.Предполагалось бы также иметь преимущество в том, что выгоняет систему из экранной заставки.

Какой простейший фрагмент кода Delphi, состоящий из 1 строки, для достижения этой цели?

Ответы [ 2 ]

6 голосов
/ 12 октября 2011

самое простое - это использование функции keybd_event (одна строка кода)

keybd_event(Ord('A'), 0, 0, 0);

Также вы можете использовать функцию SendInput, но для этого требуется более одной строки:)

Var
  pInputs : TInput;
begin
    pInputs.Itype := INPUT_KEYBOARD;
    pInputs.ki.wVk := Ord('A');
    pInputs.ki.dwFlags := KEYEVENTF_KEYUP;
    SendInput(1, pInputs, SizeOf(pInputs));
end;
0 голосов
/ 25 марта 2012

Ввод многобайтовых символов с помощью keybd_event:

procedure InsertText(text:string);
var i:integer;
    j:integer;
    ch:byte;
    str:string;
begin
  i:=1;
  while i<=Length(text) do
  begin
    ch:=byte(text[i]);
    if Windows.IsDBCSLeadByte(ch) then
       begin
         Inc(i);
         str:=inttostr(MakeWord(byte(text[i]), ch));
         keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0);
         j:=1;
         while j<=Length(str) do
         begin
               keybd_event(96+strtoint(str[j]), MapVirtualKey(96+strtoint(str[j]), 0), 0, 0);
               keybd_event(96+strtoint(str[j]), MapVirtualKey(96+strtoint(str[j]), 0), 2, 0);
               j:=j+1;
         end;
         keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP, 0);
       end
    else begin
           keybd_event(VkKeyScan(text[i]),0,0,0);
           keybd_event(VkKeyScan(text[i]),0,2,0);
         end;
    Inc(i);
  end;
end;
...