У меня есть программа, которая использует SetCursorPos для позиционирования курсора.Программа работает так, как предполагается при работе на реальном оборудовании, но при работе на ВМ (рабочая станция VMware 10.0.7) не работает.Курсор не двигается.Вместо этого я попытался использовать SendInput (системный вызов, который он делает, отличается, поэтому я подумал, что он может работать), результат такой же, как с SetCursorPos, он работает на реальном оборудовании, не работает при работе в виртуальной машине.
Вопрос в том, знает ли кто-нибудь, можно ли заставить SetCursorPos или SendInput работать на ВМ, и если да, то как?Любой другой способ позиционирования курсора в определенном месте, которое работает в ВМ, также приветствуется.
Спасибо за вашу помощь.
Для тех, кто хочет попробовать, вот некоторыекода, который я пробовал.
{$APPTYPE CONSOLE}
program ConsoleSetCursorPos;
uses
Windows
;
function GetConsoleWindow : HWND; stdcall; external kernel32;
procedure DoIt;
var
ConsoleWindow : HWND;
ClientRect : TRECT;
CursorPosRetVal : BOOL;
LastError : dword;
Desktop : HDESK;
begin
// the code below is not normally necessary - for testing only
Desktop := OpenInputDesktop(0, false, WINSTA_WRITEATTRIBUTES);
LastError := GetLastError;
writeln;
writeln('From OpenInputDesktop');
writeln('Last error (decimal) : ', LastError);
if Desktop = 0 then
begin
writeln('Program terminated due to OpenInputDesktop failure');
halt(255);
end;
if not SetThreadDesktop(Desktop) then
begin
writeln('Program terminated due to SetThreadDesktop failure');
halt(255);
end;
writeln;
// end of normally unnecessary code
SetLastError(0);
ConsoleWindow := GetConsoleWindow;
GetClientRect(ConsoleWindow, ClientRect);
ClientToScreen(ConsoleWindow, ClientRect.TopLeft);
CursorPosRetVal := SetCursorPos(ClientRect.Left, ClientRect.Top);
LastError := GetLastError;
if not CursorPosRetVal
then writeln('SetCursorPos returned false (failed)')
else writeln('SetCursorPos returned true (succeeded)');
writeln('Last error (decimal) : ', LastError);
if Desktop <> 0 then CloseDesktop(Desktop);
end;
begin
DoIt;
end.