qtewin.cpp.org

来自「远程桌面登陆软件 用rdesktop 但不基于Xwindows 可基于(nano」· ORG 代码 · 共 2,378 行 · 第 1/5 页

ORG
2,378
字号
      Item1 = ConnectionList[i];      Item2 = ConnectionList[i + 1];      Item1->ServerName = Item2->ServerName;      Item1->UserName = Item2->UserName;      Item1->Width = Item2->Width;      Item1->Height = Item2->Height;      Item1->ServerIP = Item2->ServerIP;      Item1->FullScreen = Item2->FullScreen;    }    ListBox->removeItem(i);  }}/******************************************************************************/void QMyDialog::ListBoxChanged(){  int i;  QMyConnectionItem * Item;  char Text[100];  i = ListBox->currentItem();  if (i >= 0 && i < 10)  {    Item = ConnectionList[i];    ServerNameEdit->setText(Item->ServerName);    UserNameEdit->setText(Item->UserName);    sprintf(Text, "%d", Item->Width);    WidthEdit->setText(Text);    sprintf(Text, "%d", Item->Height);    HeightEdit->setText(Text);    IPEdit->setText(Item->ServerIP);    FullScreenCheckBox->setChecked(Item->FullScreen != 0);  }}/******************************************************************************/void QMyDialog::ListBoxSelected(int /*index*/){}/******************************************************************************/void GetScanCode(QKeyEvent * e, int * ScanCode, int * code){  int key;  int mod;  int ascii;  key = e->key();  mod = e->state();  ascii = e->ascii();  *ScanCode = 0;  *code = mod; // 8 shift, 16 control, 32 alt  switch (key)  {    case 4096: // esc    case 4097: // tab    case 4099: // backspace    case 4100: // enter    case 4101: // enter    case 4103: // delete      ascii = 0;  }  if (ascii == 0)  {    switch (key)    {      case 4096: *ScanCode = 0x01; break; // esc      case 4097: *ScanCode = 0x0f; break; // tab      case 4099: *ScanCode = 0x0e; break; // backspace      case 4100: *ScanCode = 0x1c; break; // enter      case 4101: *ScanCode = 0x1c; break; // enter      case 4112: *ScanCode = 0xc7; break; // home      case 4113: *ScanCode = 0xcf; break; // end      case 4102: *ScanCode = 0xd2; break; // insert      case 4103: *ScanCode = 0xd3; break; // delete      case 4118: *ScanCode = 0xc9; break; // page up      case 4119: *ScanCode = 0xd1; break; // page down      case 4117: *ScanCode = 0xd0; break; // down arrow      case 4115: *ScanCode = 0xc8; break; // up arrow      case 4114: *ScanCode = 0xcb; break; // left arrow      case 4116: *ScanCode = 0xcd; break; // right arrow      case 4128: *ScanCode = 0x2a; break; // shift      case 4131: *ScanCode = 0x38; break; // alt      case 4129: *ScanCode = 0x1d; break; // ctrl    }    if (*ScanCode != 0)      return;  }  switch (ascii)  {    // first row    case 'q':  *ScanCode = 0x10; break;    case 'Q':  *ScanCode = 0x10; *code |= 8; break;    case '1':  *ScanCode = 0x02; break;    case 'w':  *ScanCode = 0x11; break;    case 'W':  *ScanCode = 0x11; *code |= 8; break;    case '2':  *ScanCode = 0x03; break;    case 'e':  *ScanCode = 0x12; break;    case 'E':  *ScanCode = 0x12; *code |= 8; break;    case '3':  *ScanCode = 0x04; break;    case 'r':  *ScanCode = 0x13; break;    case 'R':  *ScanCode = 0x13; *code |= 8; break;    case '4':  *ScanCode = 0x05; break;    case 't':  *ScanCode = 0x14; break;    case 'T':  *ScanCode = 0x14; *code |= 8; break;    case '5':  *ScanCode = 0x06; break;    case 'y':  *ScanCode = 0x15; break;    case 'Y':  *ScanCode = 0x15; *code |= 8; break;    case '6':  *ScanCode = 0x07; break;    case 'u':  *ScanCode = 0x16; break;    case 'U':  *ScanCode = 0x16; *code |= 8; break;    case '7':  *ScanCode = 0x08; break;    case 'i':  *ScanCode = 0x17; break;    case 'I':  *ScanCode = 0x17; *code |= 8; break;    case '8':  *ScanCode = 0x09; break;    case 'o':  *ScanCode = 0x18; break;    case 'O':  *ScanCode = 0x18; *code |= 8; break;    case '9':  *ScanCode = 0x0a; break;    case 'p':  *ScanCode = 0x19; break;    case 'P':  *ScanCode = 0x19; *code |= 8; break;    case '0':  *ScanCode = 0x0b; break;    // second row    case 'a':  *ScanCode = 0x1e; break;    case 'A':  *ScanCode = 0x1e; *code |= 8; break;    case '!':  *ScanCode = 0x02; *code |= 8; break;    case 's':  *ScanCode = 0x1f; break;    case 'S':  *ScanCode = 0x1f; *code |= 8; break;    case '@':  *ScanCode = 0x03; *code |= 8; break;    case 'd':  *ScanCode = 0x20; break;    case 'D':  *ScanCode = 0x20; *code |= 8; break;    case '#':  *ScanCode = 0x04; *code |= 8; break;    case 'f':  *ScanCode = 0x21; break;    case 'F':  *ScanCode = 0x21; *code |= 8; break;    case '$':  *ScanCode = 0x05; *code |= 8; break;    case 'g':  *ScanCode = 0x22; break;    case 'G':  *ScanCode = 0x22; *code |= 8; break;    case '%':  *ScanCode = 0x06; *code |= 8; break;    case 'h':  *ScanCode = 0x23; break;    case 'H':  *ScanCode = 0x23; *code |= 8; break;    case '_':  *ScanCode = 0x0c; *code |= 8; break;    case 'j':  *ScanCode = 0x24; break;    case 'J':  *ScanCode = 0x24; *code |= 8; break;    case '&':  *ScanCode = 0x08; *code |= 8; break;    case 'k':  *ScanCode = 0x25; break;    case 'K':  *ScanCode = 0x25; *code |= 8; break;    case '*':  *ScanCode = 0x09; *code |= 8; break;    case 'l':  *ScanCode = 0x26; break;    case 'L':  *ScanCode = 0x26; *code |= 8; break;    case '(':  *ScanCode = 0x0a; *code |= 8; break;//    case 8:    *ScanCode = 0x0e; break; // backspace    // third row    case 'z':  *ScanCode = 0x2c; break;    case 'Z':  *ScanCode = 0x2c; *code |= 8; break;    case 'x':  *ScanCode = 0x2d; break;    case 'X':  *ScanCode = 0x2d; *code |= 8; break;    case 'c':  *ScanCode = 0x2e; break;    case 'C':  *ScanCode = 0x2e; *code |= 8; break;    case 'v':  *ScanCode = 0x2f; break;    case 'V':  *ScanCode = 0x2f; *code |= 8; break;    case 'b':  *ScanCode = 0x30; break;    case 'B':  *ScanCode = 0x30; *code |= 8; break;    case '-':  *ScanCode = 0x0c; break;    case 'n':  *ScanCode = 0x31; break;    case 'N':  *ScanCode = 0x31; *code |= 8; break;    case '+':  *ScanCode = 0x0d; *code |= 8; break;    case 'm':  *ScanCode = 0x32; break;    case 'M':  *ScanCode = 0x32; *code |= 8; break;    case '=':  *ScanCode = 0x0d; break;    case ',':  *ScanCode = 0x33; break;    case ';':  *ScanCode = 0x27; break;    case ')':  *ScanCode = 0x0b; *code |= 8; break;    // fourth row//    case 9:    *ScanCode = 0x0f; break; // tab    case '/':  *ScanCode = 0x35; break;    case '?':  *ScanCode = 0x35; *code |= 8; break;    case ' ':  *ScanCode = 0x39; break;    case '\'': *ScanCode = 0x28; break;    case '"':  *ScanCode = 0x28; *code |= 8; break;    case '~':  *ScanCode = 0x29; *code |= 8; break;    case '.':  *ScanCode = 0x34; break;    case ':':  *ScanCode = 0x27; *code |= 8; break;    case '<':  *ScanCode = 0x33; *code |= 8; break;//    case 13:   *ScanCode = 0x1c; break; // enter    case '>':  *ScanCode = 0x34; *code |= 8; break;    // others//    case 27:   *ScanCode = 0x01; break; // esc    case '`':  *ScanCode = 0x29; break;    case '^':  *ScanCode = 0x07; *code |= 8; break;    case '[':  *ScanCode = 0x1a; break;    case '{':  *ScanCode = 0x1a; *code |= 8; break;    case ']':  *ScanCode = 0x1b; break;    case '}':  *ScanCode = 0x1b; *code |= 8; break;    case '\\': *ScanCode = 0x2b; break;    case '|':  *ScanCode = 0x2b; *code |= 8; break;    // ctrl keys    case 1:    *ScanCode = 0x1e; *code |= 16; break; // a    case 2:    *ScanCode = 0x30; *code |= 16; break; // b  }  if (*ScanCode == 0 && key < 3000)    printf("unknown key %d mod %d ascii %d\n", key, mod, ascii);}/******************************************************************************/QMyScrollView::QMyScrollView() : QScrollView(){}/******************************************************************************/QMyScrollView::~QMyScrollView(){}/******************************************************************************/void QMyScrollView::keyPressEvent(QKeyEvent* e){  int ScanCode, code;  GetScanCode(e, &ScanCode, &code);  if (ScanCode != 0)  {    if (code & 8) // send shift      rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0x2a, 0);    if (code & 16) // send control      rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0x1d, 0);    if (code & 32) // send alt      rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0x38, 0);    rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYPRESS, ScanCode, 0);    e->accept();  }}/******************************************************************************/void QMyScrollView::keyReleaseEvent(QKeyEvent* e){  int ScanCode, code;  GetScanCode(e, &ScanCode, &code);  if (ScanCode != 0)  {    rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, ScanCode, 0);    if (code & 8) // send shift      rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, 0x2a, 0);    if (code & 16) // send control      rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, 0x1d, 0);    if (code & 32) // send alt      rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, 0x38, 0);    e->accept();  }}/******************************************************************************/void QMyScrollView::showEvent(QShowEvent* e){  QScrollView::showEvent(e);}/******************************************************************************/void QMyScrollView::show(){  QScrollView::show();}/******************************************************************************/void QMyScrollView::polish(){  QScrollView::polish();}/******************************************************************************/void QMyScrollView::timerEvent(QTimerEvent * e){  QMyDialog * d;  QWidget * Desktop;  int dw;  int dh;  QScrollView::timerEvent(e);  killTimer(timer_id);  d = new QMyDialog(this);  if (d->exec() == 1) // ok clicked  {    g_width = d->Width;    g_height = d->Height;    g_client_width = g_width;    g_client_height = g_height;    g_fullscreen = d->FullScreen;    sprintf(g_server, "%s", (const char*)d->ServerIP);    sprintf(g_username, "%s", (const char*)d->UserName);#ifdef WITH_RDPSND    // init sound    if (g_rdpsnd)    {      rdpsnd_init();    }#endif    if (!rdp_connect(g_server, g_flags, g_domain, g_password, g_shell,                     g_directory))    {      delete d;      g_SV->close();      return;    }    g_BS = (uint8*)xmalloc(g_width * g_height * 4);    memset(g_BS, 0, g_width * g_height * 4);    g_clipx = 0;    g_clipy = 0;    g_clipcx = g_width;    g_clipcy = g_height;    g_CM = (QColorMap*)xmalloc(sizeof(struct QColorMap));    memset(g_CM, 0, sizeof(struct QColorMap));    g_CM->NumColors = 256;    g_MW = new QMyMainWindow();    g_MW->resize(g_client_width, g_client_height);    g_MW->show();    g_SV->addChild(g_MW);    g_MW->setMouseTracking(true);    g_MW->setCursor((int)10); /* Qt::BlankCursor */    g_SocketNotifier = new QSocketNotifier(g_global_sock,                                           QSocketNotifier::Read,                                           g_MW);    g_MW->connect(g_SocketNotifier, SIGNAL(activated(int)), g_MW,                  SLOT(dataReceived()));    if (g_fullscreen)    {      Desktop = g_App->desktop();      dw = Desktop->width();      dh = Desktop->height();      if (dw == g_client_width && dh == g_client_height)      {        g_MW->resize(g_client_width - 4, g_client_height - 4);      }      g_SV->showFullScreen();    }    delete d;  }  else // cancel clicked  {    delete d;    g_SV->close();  }}/******************************************************************************/QMyMainWindow::QMyMainWindow() : QWidget(g_SV->viewport()){  PopupMenu = new QPopupMenu(this);  PopupMenu->insertItem("Right click", 1, 0);  PopupMenu->insertItem("Toggle fullscreen", 2, 1);  PopupMenu->insertItem("Reset keyboard", 3, 2);  PopupMenu->insertItem("Double click", 4, 3);  connect(PopupMenu, SIGNAL(activated(int)), this, SLOT(MemuClicked(int)));}/******************************************************************************/QMyMainWindow::~QMyMainWindow(){  delete PopupMenu;}/******************************************************************************/int rd(double in){  return (int)(in + 0.50);}/******************************************************************************/int c2sx(int cx){  double sx;  sx = (double)g_client_width / (double)g_width;  return rd(cx / sx);}/******************************************************************************/int c2sy(int cy){  double sy;  sy = (double)g_client_height / (double)g_height;  return rd(cy / sy);}/******************************************************************************/void QMyMainWindow::timerEvent(QTimerEvent * e){  QWidget::timerEvent(e);  if (e->timerId() == timer_id)  {    // send mouse up    rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON1,                   rd(c2sx(mx)), rd(c2sy(my)));    // if in fullscreen, take it out or the menu won't work    if (g_fullscreen)    {      g_fullscreen = 0;      g_SV->showNormal();      g_SV->showMaximized();    }    else      PopupMenu->popup(mapToGlobal(QPoint(mx, my)));  }  killTimer(timer_id);}/******************************************************************************/void QMyMainWindow::MemuClicked(int MenuID){  QWidget * Desktop;  int dw;  int dh;  if (MenuID == 1) // right click  {    rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_DOWN | MOUSE_FLAG_BUTTON2,                   rd(c2sx(mx)), rd(c2sy(my)));    rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON2,                   rd(c2sx(mx)), rd(c2sy(my)));  }  else if (MenuID == 2) // toggle full screen  {    g_fullscreen = ~g_fullscreen;    if (g_fullscreen)    {      Desktop = g_App->desktop();      dw = Desktop->width();      dh = Desktop->height();      if (dw == g_client_width && dh == g_client_height)        g_MW->resize(g_client_width - 4, g_client_height - 4);      g_SV->showFullScreen();    }    else    {      g_SV->showNormal();      g_SV->showMaximized();      g_MW->resize(g_client_width, g_client_height);    }  }  else if (MenuID == 3) // reset keyboard  {    rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, 0x2a, 0); // shift    rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, 0x1d, 0); // control    rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, 0x38, 0); // alt  }  else if (MenuID == 4) // double click  {    rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_DOWN | MOUSE_FLAG_BUTTON1,                   rd(c2sx(mx)), rd(c2sy(my)));    rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON1,                   rd(c2sx(mx)), rd(c2sy(my)));    rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_DOWN | MOUSE_FLAG_BUTTON1,                   rd(c2sx(mx)), rd(c2sy(my)));    rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON1,                   rd(c2sx(mx)), rd(c2sy(my)));  }}/******************************************************************************/void QMyMainWindow::mouseMoveEvent(QMouseEvent* e){  int x, y;  x = e->x();  y = e->y();  if (timer_id)  {    x = x - mx;    y = y - my;    if (x < -10 || x > 10 || y < -10 || y > 10)    {      killTimer(timer_id);      timer_id = 0;

⌨️ 快捷键说明

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