alex33 сказал(а):
#include <Process.au3>
RunAs('Username', @ComputerName, 'Password', 0, 'cmd /c start '&@ScriptDir&'\Block.exe', '', @SW_HIDE)
RunAs('Username', @ComputerName, 'Password', 1, 'cmd /c start '&@ScriptDir&'\Block.exe', '', @SW_HIDE)
RunAs('Username', @ComputerName, 'Password', 0, @ScriptDir&'\Block.exe', '', @SW_HIDE)
RunAs('Username', @ComputerName, 'Password', 1, @ScriptDir&'\Block.exe', '', @SW_HIDE)
_RunDos('/noprofiles /user:'&@ComputerName&'\Username '&@ScriptDir&'\Block.exe')
Тогда можно просто использовать директивуЕсли совсем без прав администратора никак, то можно рассмотреть другой вариант
#RequireAdmin
Не легче вообще его отключить, поставить на 0?Vovsla сказал(а):Можно, но потребуются действия пользователя. А в данном случае все должно работать автоматически.
library LowLevelMouseHook;
uses
Windows,
Messages;
const
WH_MOUSE_LL = 14;
MMFName: PChar = 'MMF';
type
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = packed record
WndHook: HWND;
Wnd: HWND;
end;
type
TMouseHookFilters = record
BlockMouseMove: boolean;
BlockLeftButton: boolean;
BlockRightButton: boolean;
BlockMiddleButton: boolean;
BlockWheel: boolean;
end;
var
GlobalData: PGlobalDLLData;
MMFHandle: THandle;
Filters: TMouseHookFilters;
MWM_LBUTTONDOWN: Cardinal;
MWM_LBUTTONUP: Cardinal;
MWM_MBUTTONDOWN: Cardinal;
MWM_MBUTTONUP: Cardinal;
MWM_RBUTTONDOWN: Cardinal;
MWM_RBUTTONUP: Cardinal;
MWM_MOUSEWHEEL: Cardinal;
MWM_MOUSEMOVE: Cardinal;
function LowLevelMouseProc(Code: Integer; wParam: DWORD; lParam: DWORD): Longint; stdcall;
begin
if (Code = HC_ACTION) then
begin
if (wParam = WM_LBUTTONDOWN) then
begin
SendMessage(GlobalData.Wnd, MWM_LBUTTONDOWN, 0, 0);
if Filters.BlockLeftButton = True then
Result := - 1
else
Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
end else
if (wParam = WM_LBUTTONUP) then
begin
SendMessage(GlobalData.Wnd, MWM_LBUTTONUP, 0, 0);
if Filters.BlockLeftButton = True then
Result := - 1
else
Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
end else
if (wParam = WM_MBUTTONDOWN) then
begin
SendMessage(GlobalData.Wnd, MWM_MBUTTONDOWN, 0, 0);
if Filters.BlockMiddleButton = True then
Result := - 1
else
Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
end else
if (wParam = WM_MBUTTONUP) then
begin
SendMessage(GlobalData.Wnd, MWM_MBUTTONUP, 0, 0);
if Filters.BlockMiddleButton = True then
Result := - 1
else
Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
end else
if (wParam = WM_RBUTTONDOWN) then
begin
SendMessage(GlobalData.Wnd, MWM_RBUTTONDOWN, 0, 0);
if Filters.BlockRightButton = True then
Result := - 1
else
Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
end else
if (wParam = WM_RBUTTONUP) then
begin
SendMessage(GlobalData.Wnd, MWM_RBUTTONUP, 0, 0);
if Filters.BlockRightButton = True then
Result := - 1
else
Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
end else
if (wParam = WM_MOUSEWHEEL) then
begin
SendMessage(GlobalData.Wnd, MWM_MOUSEWHEEL, 0, 0);
if Filters.BlockWheel = True then
Result := - 1
else
Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
end else
if (wParam = WM_MOUSEMOVE) then
begin
SendMessage(GlobalData.Wnd, MWM_MOUSEMOVE, 0, 0);
if Filters.BlockMouseMove = True then
Result := - 1
else
Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
end
else
Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
end;
end;
function StartMouseHook(State: Boolean; Wnd: HWND): Boolean; export; stdcall;
begin
Result := False;
if State = True then
begin
GlobalData^.WndHook := SetWindowsHookEx(WH_MOUSE_LL, @LowLevelMouseProc, hInstance, 0);
GlobalData^.Wnd := Wnd;
if GlobalData^.WndHook <> 0 then
Result := True;
end
else
begin
UnhookWindowsHookEx(GlobalData^.WndHook);
Result := False;
end;
end;
function StopMouseHook(): Boolean; export; stdcall;
begin
UnhookWindowsHookEx(GlobalData^.WndHook);
if GlobalData^.WndHook = 0 then
Result := False
else
Result := True;
end;
function UpdateMouseHook(HookFilters: TMouseHookFilters): Boolean; export; stdcall;
begin
Filters := HookFilters;
end;
procedure OpenGlobalData();
begin
MWM_LBUTTONDOWN := RegisterWindowMessage('MWM_LBUTTONDOWN');
MWM_LBUTTONUP := RegisterWindowMessage('MWM_LBUTTONUP');
MWM_MBUTTONDOWN := RegisterWindowMessage('MWM_MBUTTONDOWN');
MWM_MBUTTONUP := RegisterWindowMessage('MWM_MBUTTONUP');
MWM_RBUTTONDOWN := RegisterWindowMessage('MWM_RBUTTONDOWN');
MWM_RBUTTONUP := RegisterWindowMessage('MWM_RBUTTONUP');
MWM_MOUSEWHEEL := RegisterWindowMessage('MWM_MOUSEWHEEL');
MWM_MOUSEMOVE := RegisterWindowMessage('MWM_MOUSEMOVE');
MMFHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
GlobalData := MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
if GlobalData = nil then
CloseHandle(MMFHandle);
end;
procedure CloseGlobalData();
begin
UnmapViewOfFile(GlobalData);
CloseHandle(MMFHandle);
end;
procedure DLLEntryPoint(Reason: DWORD);
begin
case Reason of
DLL_PROCESS_ATTACH: OpenGlobalData;
DLL_PROCESS_DETACH: CloseGlobalData;
end;
end;
exports StartMouseHook, StopMouseHook, UpdateMouseHook;
begin
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
{Автор Зорков Игорь - [email protected]
Спасибо Мастерам Delphi за их сайт - http://www.delphimaster.ru,
Пожалуй лучший (на мой взгляд) сайт на английском языке посвящённый Delphi - http://www.torry.net,
Все исходники Delphi здесь - http://www.delphisources.ru/index.html}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
gbHookStatus: TGroupBox;
btnStopHook: TButton;
btnStartHook: TButton;
btnUpdateHook: TButton;
gbFilterOptions: TGroupBox;
cbBlockLeftButton: TCheckBox;
cbBlockMiddleButton: TCheckBox;
cbBlockRightButton: TCheckBox;
cbBlockMouseMove: TCheckBox;
cbBlockWheel: TCheckBox;
gbStayOnTop: TGroupBox;
cbStayOnTop: TCheckBox;
cbLeftMouseClick: TCheckBox;
cbMiddleMouseClick: TCheckBox;
cbRightMouseClick: TCheckBox;
procedure btnStartHookClick(Sender: TObject);
procedure btnUpdateHookClick(Sender: TObject);
procedure btnStopHookClick(Sender: TObject);
procedure cbStayOnTopClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
protected
procedure WndProc(var Msg: TMessage); override;
private
{ Private declarations }
public
{ Public declarations }
procedure UpdateHook();
end;
type
TMouseHookFilters = record
BlockMouseMove: boolean;
BlockLeftButton: boolean;
BlockRightButton: boolean;
BlockMiddleButton: boolean;
BlockWheel: boolean;
end;
var
Form1: TForm1;
HookEnable: Boolean = False;
HookFilters: TMouseHookFilters;
MWM_LBUTTONDOWN: Cardinal;
MWM_LBUTTONUP: Cardinal;
MWM_MBUTTONDOWN: Cardinal;
MWM_MBUTTONUP: Cardinal;
MWM_RBUTTONDOWN: Cardinal;
MWM_RBUTTONUP: Cardinal;
MWM_MOUSEWHEEL: Cardinal;
MWM_MOUSEMOVE: Cardinal;
{Если в папке отсутствует LowLevelMouseHook.dll откройте и скомпилируйте проект LowLevelMouseHook
(File->Open Project...->LowLevelMouseHook.dpr)
Project->Compile LowLevelMouseHook}
function StartMouseHook(State: Boolean; Wnd: HWND): Boolean; stdcall; external 'LowLevelMouseHook.dll';
function StopMouseHook(): Boolean; stdcall; external 'LowLevelMouseHook.dll';
function UpdateMouseHook(HookFilters: TMouseHookFilters): Boolean; stdcall; external 'LowLevelMouseHook.dll';
implementation
{$R *.dfm}
procedure TForm1.WndProc(var Msg: TMessage);
begin
inherited;
if (Msg.Msg = MWM_LBUTTONDOWN) then
begin
cbLeftMouseClick.Checked := true
end;
if (Msg.Msg = MWM_LBUTTONUP) then
begin
cbLeftMouseClick.Checked := false;
end;
if (Msg.Msg = MWM_MBUTTONDOWN) then
begin
cbMiddleMouseClick.Checked := true
end;
if (Msg.Msg = MWM_MBUTTONUP) then
begin
cbMiddleMouseClick.Checked := false;
end;
if (Msg.Msg = MWM_RBUTTONDOWN) then
begin
cbRightMouseClick.Checked := true
end;
if (Msg.Msg = MWM_RBUTTONUP) then
begin
cbRightMouseClick.Checked := false;
end;
end;
procedure TForm1.UpdateHook();
begin
if cbBlockLeftButton.Checked then
HookFilters.BlockLeftButton := True
else
HookFilters.BlockLeftButton := False;
if cbBlockMiddleButton.Checked then
HookFilters.BlockMiddleButton := True
else
HookFilters.BlockMiddleButton := False;
if cbBlockRightButton.Checked then
HookFilters.BlockRightButton := True
else
HookFilters.BlockRightButton := False;
if cbBlockWheel.Checked then
HookFilters.BlockWheel := True
else
HookFilters.BlockWheel := False;
if cbBlockMouseMove.Checked then
HookFilters.BlockMouseMove := True
else
HookFilters.BlockMouseMove := False;
UpdateMouseHook(HookFilters);
end;
procedure TForm1.btnStartHookClick(Sender: TObject);
begin
if StartMouseHook(True, Handle) = True then
begin
HookEnable := True;
btnStartHook.Enabled := False;
btnStopHook.Enabled := True;
btnUpdateHook.Enabled := True;
UpdateHook();
end else
//
end;
procedure TForm1.btnStopHookClick(Sender: TObject);
begin
if StopMouseHook = True then
begin
HookEnable := False;
btnStopHook.Enabled := False;
btnUpdateHook.Enabled := False;
btnStartHook.Enabled := True;
end else
//
end;
procedure TForm1.btnUpdateHookClick(Sender: TObject);
begin
UpdateHook();
end;
procedure TForm1.cbStayOnTopClick(Sender: TObject);
begin
if cbStayOnTop.Checked then
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE)
else
SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if HookEnable <> False then
StopMouseHook;
end;
initialization
MWM_LBUTTONDOWN := RegisterWindowMessage('MWM_LBUTTONDOWN');
MWM_LBUTTONUP := RegisterWindowMessage('MWM_LBUTTONUP');
MWM_MBUTTONDOWN := RegisterWindowMessage('MWM_MBUTTONDOWN');
MWM_MBUTTONUP := RegisterWindowMessage('MWM_MBUTTONUP');
MWM_RBUTTONDOWN := RegisterWindowMessage('MWM_RBUTTONDOWN');
MWM_RBUTTONUP := RegisterWindowMessage('MWM_RBUTTONUP');
MWM_MOUSEWHEEL := RegisterWindowMessage('MWM_MOUSEWHEEL');
MWM_MOUSEMOVE := RegisterWindowMessage('MWM_MOUSEMOVE');
end.
MouseOnEvent - Обработка событии мышкиреализована через хуки. Как это можно реализовать на AutoIt'е?
Эта "штука", как вы выразились, блокирует работу клавиатуры для окон с такими же правами и ниже. Если скрипт запустить с правами администратора, то будет блокировка всех окон. Если с правами пользователя, то блокируется ввод для всех окон, кроме запущенных с правами администратора. Следовательно, данной UDF достаточно для блокировки пользовательского ввода, т.к. запустить программу от имени администратора он всё равно не сможет.Спасибо, штука полезная, но в данном случае не помогла.
Для этого нужна возможность создавать DLL...Как это можно реализовать на AutoIt
И MouseOnEvent и BlockInputEx используют LL-хуки и нормально работают без всяких DLL.LowLevel Hook заключается в том что DLL подгружается во все процессы...
Все никак понять не могу, с чего у вас такая лютая любовь к dll? Что ни пост - то нужна dll. Так дойдем и до арифметических операций через dll.LowLevel Hook заключается в том что DLL подгружается во все процессы...
Вам же давали ссылку на BlockInputEx. Там и для клавиатуры и для мыши - два в одном.аналогичная библиотека для клавиатуры
#include <WindowsConstants.au3>
#include <WinAPI.au3>
OnAutoItExitRegister("OnClose")
$hStub_KeyProc = DllCallbackRegister("KeyProc", "long", "int;wparam;lparam")
$hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), _WinAPI_GetModuleHandle(0))
Sleep(5000)
Func KeyProc($nCode, $wParam, $lParam)
Local $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
If $wParam = $WM_KEYDOWN Then Return 1
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc
Func OnClose()
_WinAPI_UnhookWindowsHookEx($hHook)
DllCallbackFree($hStub_KeyProc)
EndFunc