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 + -
显示快捷键?