1.可以使用Api函数,但时间太久,实在记不清楚了,你自己查一下吧
2.这个问题没有处理过
3.可以在MouseMove消息相应函数中判断,使用SetCapture()(捕捉鼠标函数),然后判断鼠标位置是否在"按钮"上即可

解决方案 »

  1.   

    1、
    int WINAPI WlxLoggedOnSAS (
    PVOID pWlxContext,
    DWORD dwSasType,
    PVOID pReserved)

    HANDLE hMutex;
    WriteInfo("WlxLoggedOnSAS \r\n"); //用于记录信息
    if (dwSasType == WLX_SAS_TYPE_CTRL_ALT_DEL){ //屏蔽CTRL_ALT_DEL,也可以根据特定条件来决定是否要屏蔽
    //我采用了Mutex来控制是否屏蔽,(注意:要用unicode)
    hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, L"_ac952_z_cn_CTRL_ALT_DEL");
    if (hMutex){
    CloseHandle(hMutex);
    WriteInfo("disble CTRL+ALT+DEL \r\n");
    return WLX_SAS_ACTION_NONE; //将屏幕切换到应用程序桌面,屏蔽掉CTRL+ALT+DEL
    }
    else
    WriteInfo("not disble CTRL+ALT+DEL \r\n");
    }
    return prcWlxLoggedOnSAS ( //这是我从MSGINA.DLL中获取的函数。
    pWlxContext,
    dwSasType,
    pReserved);
    }
    我们要在自己的程序中调用hMutex = CreateMutex(NULL, FALSE, "_ac952_z_cn_CTRL_ALT_DEL");就可屏蔽CTRL+ALT+DEL。
      

  2.   

    得到鼠标所在位置的窗体名称 
    function GetParentWindowNameAt ( X, Y : integer ) : string; 
    var P : TPoint; W : TWinControl; 
    begin 
    P.X := X; 
    P.Y := Y; 
    W := FindVCLWindow( P ); 
    if( nil <> W ) then 
    Result := W.Name; 
    Result := ''; 
    end; 
      

  3.   

    3、
    CM_MOUSEENTER
    CM_MOUSELEAVE
    必须自己继承控件,因为这不是Windows的标准消息。
    在Form中声明两个函数:
     procedure CMMouseEnter(var msg:tmessage);message CM_MOUSEENTER; 
     procedure CMMouseLeave(var msg:tmessage);message CM_MOUSELEAVE;
    实现部分如下:
    procedure Form.CMMouseEnter(var msg:tmessage);
    var
     obj:TObject;
    begin
     obj:=Tobject(msg.lParam);//鼠标所在的控件
     if obj<>nil then
     begin 
      //确定控件的类型
       //你的处理
     end;
    end;procedure Form.CMMouseLeave(var msg:tmessage);
    var
     obj:TObject;
    begin
     obj:=Tobject(msg.lParam);//鼠标所在的控件
     if obj<>nil then
     begin 
      //确定控件的类型
       //你的处理
     end;
    end;
      

  4.   

    楼上说的对,其实都是delphi的api的调用..
      

  5.   

    2、
    限制鼠标的活动范围:
    在Form中放置二个 Button, 然後分别为这两个按钮定义OnClick响应事件如下: 
    procedure TForm1.Button1Click(Sender: TObject); 
    var 
    btButton2: TRect; 
    begin 
    btButton2 := Button2.BoundsRect; 
    MapWindowPoints(handle, 0, btButton2, 2); // 座标换算 
    ClipCursor(@btButton2); // 限制鼠标移动区域 
    end; 
    procedure TForm1.Button2Click(Sender: TObject); 
    var 
    btScreen: TRect; 
    begin 
    btScreen := Rect(0, 0, Screen.Width, Screen.Height); 
    ClipCursor(@btScreen); 
    end;
      

  6.   

    锁鼠标就是建立一个TRect区域(例rtscreen),然后用MapWindowPoints(0,0,rtscreen, 2); 进行座标换算,再ClipCursor(@rtscreen);
    不过,你锁鼠标时如果不锁定系统功能键,则可能发生鼠标从该区域离开的现象(具体原因不知,也请高人指点).
      

  7.   

    屏蔽系统功能健,如ctrl+alt+del,也可采用进入屏保状态的方法;
    //进入屏保状态
      SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1,nil, 0);
    //解除屏保状态
       SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, nil, 0);
      

  8.   

    //进入屏保状态
      SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1,nil, 0);
    //解除屏保状态
       SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, nil, 0);
    锁鼠标就是建立一个TRect区域(例rtscreen),然后用MapWindowPoints(0,0,rtscreen, 2); 进行座标换算,再ClipCursor(@rtscreen);
    FindVCLWindow( P );