⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.pas

📁 这是一个非常好的教师和学生沟通用的电子教室!
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    except
      bmpstream.clear;
      exit;
    end;

    if len <> 1024 then //已读完
    begin
      bmpstream.Position := 0;
      drawstream.clear;
     // wshtest1:=send_streamsize;
     // wshtest2:=bmpstream.Size;
      if send_streamsize = bmpstream.Size then
      begin
        drawstream.LoadFromStream(bmpstream);
        drawstream.Position := 0;
       // drawstream.SaveToFile('h:\draw.bmp');
       // drawstream.Position := 0;
        hua_ok := true; //可开始画屏幕
      end;
      bmpstream.Clear;

    end;

  end;

end;

procedure TForm1.WSocketHookDataAvailable(Sender: TObject; Error: Word);
var
  s_leng, x_leng, y_leng, l_command: integer;
  key_char, w_x, w_y, w_state, s_command: string;
begin
  s_command := WSOCKEThook.ReceiveStr;
  l_command := length(s_command);
  if trim(s_command) = '紧急照会' then
  begin
    Panel1.Caption := '正在登陆...';
 //发送登陆消息
    loginwsocket.Close;
    LoginwSocket.Multicast := true;
    loginwSocket.Proto := 'udp';
    LoginwSocket.Addr := '225.1.2.8'; // or whatever you decide
    loginwSocket.Port := '1525';
    loginwSocket.Connect;
  end;


  if l_command > 12 then
  begin
    s_leng := pos('state:=', s_command);
    x_leng := pos('x:=', s_command);
    y_leng := pos('y:=', s_command);
    w_state := copy(s_command, 8, x_leng - s_leng - 7);
    w_x := copy(s_command, x_leng + 3, y_leng - x_leng - 3);
    w_y := copy(s_command, y_leng + 3, length(s_command) - y_leng - 2);

    case strtoint(trim(w_state)) of
      160:
        setcursorpos(strtoint(trim(w_x)), strtoint(trim(w_y)));
//  mouse_event(MOUSEEVENTF_LEFTUP,strtoint(trim(w_x)),strtoint(trim(w_y)),0,0);
      161:
        if guangbo_state <> '屏幕广播' then
          mouse_event(MOUSEEVENTF_LEFTDOWN, strtoint(trim(w_x)), strtoint(trim(w_y)), 0, 0);
      512:
        setcursorpos(strtoint(trim(w_x)), strtoint(trim(w_y)));
 //mouse_event(MOUSEEVENTF_MOVE,strtoint(trim(w_x)),strtoint(trim(w_y)),0,0);
      513:
        if guangbo_state <> '屏幕广播' then
          mouse_event(MOUSEEVENTF_LEFTDOWN, strtoint(trim(w_x)), strtoint(trim(w_y)), 0, 0);
      514:
        if guangbo_state <> '屏幕广播' then
          mouse_event(MOUSEEVENTF_LEFTUP, strtoint(trim(w_x)), strtoint(trim(w_y)), 0, 0);
      515:
        if guangbo_state <> '屏幕广播' then
          mouse_event(MOUSEEVENTF_LEFTDOWN, strtoint(trim(w_x)), strtoint(trim(w_y)), 0, 0);
      516:
        if guangbo_state <> '屏幕广播' then
          mouse_event(MOUSEEVENTF_RIGHTDOWN, strtoint(trim(w_x)), strtoint(trim(w_y)), 0, 0);
      517:
        if guangbo_state <> '屏幕广播' then
          mouse_event(MOUSEEVENTF_RIGHTUP, strtoint(trim(w_x)), strtoint(trim(w_y)), 0, 0);
    end;
  end
  else //否则为键盘HOOK
  begin
    if copy(s_command, 1, 4) = 'down' then
    begin
      key_char := copy(s_command, 7, l_command - 6);
      if strtoint(key_char) = 666 then //如果为SHIFTUP键
      begin
        keybd_event(16, 0, KEYEVENTF_KEYUP, 0);
        exit;
      end;

      keybd_event(strtoint(key_char), 0, 0, 0); //按下此键
  //不是ALT,SHIFT,CTL键时,KEYUP
      if (strtoint(key_char) < 16) or (strtoint(key_char) > 18) then
        keybd_event(strtoint(key_char), 0, KEYEVENTF_KEYUP, 0);
    end
    else
    begin
      key_char := copy(s_command, 5, l_command - 4); //得到字符
      keybd_event(strtoint(key_char), 0, KEYEVENTF_KEYUP, 0);
    end;

    if strtoint(key_char) = 27 then //如果为ESC键,释放ALT,CTL,SHIFT
    begin
      keybd_event(16, 0, KEYEVENTF_KEYUP, 0);
      keybd_event(17, 0, KEYEVENTF_KEYUP, 0);
      keybd_event(18, 0, KEYEVENTF_KEYUP, 0);
    end;

  end;
end;

procedure TForm1.IPX1ReceiveData(Sender: TObject; Buffer: PChar;
  BufferLength: Integer; SockAddr: TSockAddrIPX; SockAddrLen: Integer);
var
  recbuf: array[0..1023] of char;
  rec: string;
  i: smallint;
begin
  if bufferlength <= 6 then exit;

  recbuf := #0;

  for i := 0 to bufferlength - 1 do
  begin
    recbuf[i] := buffer[i];
  end;

  try
    bmpstream.WriteBuffer(recbuf, bufferlength);
  except
    bmpstream.clear;
    exit;
  end;

  if bufferlength <> 1024 then //已读完
  begin
    bmpstream.Position := 0;
    drawstream.clear;
    if send_streamsize = bmpstream.Size then
    begin
      drawstream.LoadFromStream(bmpstream);
      drawstream.Position := 0;
      hua_ok := true; //可开始画屏幕
    end;
    bmpstream.Clear;
  end;

end;

procedure TForm1.LoginTimerTimer(Sender: TObject);
begin
  LMDTrayIcon1.Active := true;

  if Panel1.Caption = '登陆成功!' then
  begin
    LoginTimer.Enabled := false;
    loginwsocket.Close;
  end
  else
  begin
  try
  loginwsocket.SendStr('/*csh*/:' + #13 + #10 + '我要登陆' + trim(localiplist.Strings[0]) +
      'wshwzh' + s_computername);
  except
    LoginTimer.Enabled := false;
    loginwsocket.Close;
    showmessage('网络不通!');
  end;
  end;
end;

procedure TForm1.IPX2ReceiveData(Sender: TObject; Buffer: PChar;
  BufferLength: Integer; SockAddr: TSockAddrIPX; SockAddrLen: Integer);
var
  w_x, w_y, s_command: string;
  x_leng, y_leng, i, myxor, imagesize: integer;
begin
  s_command := '';
  for i := 0 to BufferLength - 1 do
    s_command := s_command + string(buffer[i]);

  if bufferlength > 12 then
  begin
    x_leng := pos('x:=', s_command);
    y_leng := pos('y:=', s_command);
    w_x := copy(s_command, x_leng + 3, y_leng - x_leng - 3);
    w_y := copy(s_command, y_leng + 3, length(s_command) - y_leng - 2);
    setcursorpos(strtoint(trim(w_x)), strtoint(trim(w_y)));
  end
  else
  begin
    try
      myxor := pos('xor', s_command);
      if myxor > 0 then
      begin imagesize := strtoint(copy(s_command, 1, length(s_command) - 3));
        quan_screen := false;
      end
      else
      begin
        imagesize := strtoint(s_command);
        quan_screen := true;
      end;
    except
      send_streamsize := 0;
      imagesize := 0;
    end;
    send_streamsize := imagesize;
    s_command := '';
  end;

end;

procedure TForm1.SoundIN1Data(data: Pointer; size: Integer);
var
  fa_ci, fa_yu, i: smallint;
  buf1: array[0..1023] of char;
begin
  sendwav.WriteBuffer(data^, size);
  sendwav.Position := 0;
  fa_ci := sendwav.Size div 1024;
  fa_yu := sendwav.Size mod 1024;
  for i := 1 to fa_ci do
  begin
    sleep(1);
    sendwav.ReadBuffer(buf1, 1024);
    SVoiceSocket.Send(@buf1, 1024);
  end;
  if fa_yu > 0 then
  begin
    sleep(1);
    sendwav.ReadBuffer(buf1, fa_yu);
    SVoiceSocket.Send(@buf1, fa_yu);
  end;
  sendwav.Clear;

end;

procedure TForm1.RVoiceSocketDataAvailable(Sender: TObject; Error: Word);
var
  voice_recbuf: array[0..1023] of char;
  len: integer;
begin
  voice_recbuf := #0;
  len := RVoiceSocket.Receive(@voice_recbuf, 1024);
  if len > 0 then begin
    voice_wsh.WriteBuffer(voice_recbuf, len);

    if len <> 1024 then
    begin
      try
        voice_wsh.Position := 0;
        SoundOut1.PlayBack(voice_wsh.Memory, voice_wsh.Size);
        voice_wsh.Clear;
        voice_wsh.Position := 0;
      except
        voice_wsh.Clear;
        voice_wsh.Position := 0;
      end;
    end;
  end;

end;

procedure TForm1.PingmuTimerTimer(Sender: TObject);
var
  i, fa_ci, fa_yu, cursorx, cursory: integer;
  dc: hdc;
  wshcan: Tcanvas;
  R: TRect;
  compressstream: Tmemorystream;
  mylzh: Tlzrw1;
  buf1: array[0..1023] of char;
  DrawPos: TPoint;
  MyCursor: TIcon;
  hld: hwnd;
  Threadld: dword;
  mp: tpoint;
  pIconInfo: TIconInfo;
  maskbitmap, colorbitmap: Tbitmap;
  steamsize: integer;
  cshjpeg: tjpegimage;
  streamsize: string;
begin
  cshjpeg:=tjpegimage.Create ;
  bmpmap1 := Tbitmap.Create; //建立BMPMAP

  wshcan := TCanvas.Create; //屏幕截取
  dc := GetWindowDC(0);
  try
    wshcan.Handle := dc;
  //  R := Rect(0, 0, screen.Width, screen.Height);
    R := Rect(0, 0, screen.Width, screen.Height);
    bmpmap1.Width := R.Right;
    bmpmap1.Height := R.Bottom;

    if bmpmap1.Canvas.TryLock then
      bmpmap1.Canvas.CopyRect(R, wshcan, R)
    else
    begin
      releaseDC(0, DC);
      bmpmap1.canvas.Unlock;
      //wshcan.Unlock;
      wshcan.Handle := 0;
      wshcan.Free;
      bmpmap1.FreeImage;
      bmpmap1.Free;
      bmpmap1 := nil;

   //   PingmuTimer.Enabled := true;
      exit;
    end;
  finally
    releaseDC(0, DC);
    bmpmap1.canvas.Unlock;
  end;
  wshcan.Handle := 0;
  wshcan.Free;


  //画上鼠标图象
  GetCursorPos(DrawPos);
  //DrawPos := Point(CursorPos.x - HotSpot.x, CursorPos.y - HotSpot.y);
  MyCursor := TIcon.Create;
 // GetCursorIcon(MyCursor);子程序
  getcursorpos(mp);
  hld := WindowFromPoint(mp);
  Threadld := GetWindowThreadProcessId(hld, nil);
  AttachThreadInput(GetCurrentThreadId, Threadld, True);
  MyCursor.Handle := Getcursor();
  AttachThreadInput(GetCurrentThreadId, threadld, False);
  GetIconInfo(Mycursor.Handle, pIconInfo);
  cursorx := DrawPos.x - round(pIconInfo.xHotspot);
  cursory := DrawPos.y - round(pIconInfo.yHotspot);
  bmpmap1.Canvas.Draw(cursorx, cursory, MyCursor); //画上鼠标
  //释放数组内存
  MaskBitmap := TBitmap.Create;
  ColorBitmap := TBitmap.Create;
  MaskBitmap.Handle := piconinfo.hbmMask;
  ColorBitmap.Handle := piconinfo.hbmColor;
  MaskBitmap.FreeImage;
  ColorBitmap.FreeImage;
  MaskBitmap.free;
  ColorBItmap.free;

  Mycursor.ReleaseHandle;
  MyCursor.Free; //释放鼠标指针


  //建立需要发送的屏幕流
  ScreenStream := TMemoryStream.Create;
  Screenstream.Clear;
  screenstream.Position := 0;

  compressstream := Tmemorystream.Create; //建立压缩流
  compressstream.Clear;
 // 现在的屏幕保存如流,应该建立一个黑色流,以后发送XOR后的图象
 // bmpmap1.SaveToFile('tong.bmp');
  //bmpmap1.SaveToStream(compressstream); //发送XOR流
  bmpmap1.PixelFormat :=pf8bit;
  cshjpeg.Assign(bmpmap1);
  cshjpeg.SaveToStream(compressstream);
  bmpmap1.FreeImage;
  bmpmap1.Free;
  cshjpeg.Free;
  bmpmap1 := nil;
  cshjpeg:=nil;
  compressstream.Position := 0;

 // case compress_mode of
  with vclzip1 do //压缩流用ZIP
  begin
    packlevel := 1;
    ArchiveStream := TMemoryStream.Create;
    archivestream.Position := 0;
    ZipFromStream(compressstream, 'screen.jpg');
    archivestream.Position := 0;
    screenstream.LoadFromStream(archivestream);
    archivestream.Free;
    archivestream := nil;
  end;
    //  end;
//  LmdHiTImer2timer(sender);
  compressstream.Clear;
  compressstream.Free;

  screenstream.Position := 0; //发送图象的大小,防止出错!
  streamsize := inttostr(screenstream.Size);
//  memo1.Lines.Add(inttostr(screenstream.size));

  if quan_screen then
    wsocketsize.SendStr(streamsize)
  else wsocketsize.SendStr(streamsize + 'xor');

  //如果屏幕相同发送满屏
  if shang_size = screenstream.size then
  begin
    shang_ci := shang_ci + 1;
    if shang_ci = 2 then //发送全部屏幕
    begin
      shang_ci := 0;
      quan_screen := true;
      screenstream.Clear;
      screenstream.free;
      screenstream := nil; //发送一帧屏幕完成!
    //  PingmuTimer.Enabled := true;
      exit;
    end;
  end;


//发送图象
  steamsize := screenstream.Size;
  shang_size := steamsize;

  if (steamsize > 130000) and (quan_screen = false) then
  begin
    quan_screen := true;
    screenstream.Clear;
    screenstream.free;
    screenstream := nil; //发送一帧屏幕完成!
  //  PingmuTimer.Enabled := true;
    exit;
  end;

  allsize := allsize + steamsize;
  buf1 := #0;
  fa_ci := steamsize div 1024;
  fa_yu := steamsize mod 1024;
//  if fa_yu = 0 then wsh_test := wsh_test + 1;
  f

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -