请问有谁知道VNC软件的源代码?

2024-05-18 02:40

1. 请问有谁知道VNC软件的源代码?

vnc win-hook + event-simulate + gdi-bitmap-capture(delay send) + libjpeg + socket ******************************************************************************************************************* VNC的图像更新机制核心为,桌面区域更新记录策略和更新区域通知策略。 桌面更新区域记录主要是通过hooks记录桌面上变化的矩形区域, 只记录更新的矩形区不记录具体更新的数据。 更新区域记录步骤大致如下: 1.wm_hooks截获桌面变化的相关消息,并转化为自定义的消息发送给WMHooksThread线程处理。  2. WMHooksThread 中用SimpleUpdateTracker new_changes记录新的更新区域. 3.把SimpleUpdateTracker new_changes更新拷贝到SDisplay中。 4.每次要发送桌面更新的时候,把SDisplay中记录的更新区域传给VNCServerST 对象中。 更新区域的通知主要有poll和push两种机制。push是服务器每隔10ms检查有没有更新,如果有更新则主动把更新推送给客户端, poll机制则是客户端主动请求更新,客户端通过发送framebufferupdate请求某一个区域更新,服务器处理该消息发送相应的更新。
详细分析如下:  1.Wm_hooks截获消息并转化为自定义的消息发送给WMHooksThread线程处理。  Wm_hooks自定义的消息:  UINT WM_HK_WindowChanged = RegisterWindowMessage(_T("RFB.WM_Hooks.WindowChanged"));  UINT WM_HK_WindowClientAreaChanged = UINT WM_HK_WindowBorderChanged = RegisterWindowMessage(_T("RFB.WM_Hooks.WindowBorderChanged"));  UINT WM_HK_RectangleChanged = RegisterWindowMessage(_T("RFB.WM_Hooks.RectangleChanged"));  UINT WM_HK_CursorChanged = RegisterWindowMessage(_T("RFB.WM_Hooks.CursorChanged"));  钩子截获到消息以后,把它转化为自定义的消息,然后发送给WMHooksThread线程处理,消息转化如下:  边框更新消息:WM_NCPAINT,WM_NCACTIVATE  客户区域更新消息:BM_SETCHECK, BM_SETSTATE,EM_SETSEL,WM_CHAR,WM_ENABLE,WM_KEYUP,WM_LBUTTONUP,WM_MBUTTONUP,WM_PALETTECHANGED,WM_RBUTTONUP,WM_SYSCOLORCHANGE,WM_SETTEXT。  窗口改变消息:WM_HSCROLL,WM_VSCROLL,482,485。  矩形区更新消息:WM_DESTROY  窗口客户区消息:WM_PAINT  鼠标消息:WM_NCMOUSEMOVE,WM_MOUSEMOVE  2 . WMHooksThread 中用SimpleUpdateTracker new_changes记录新的更新区域  WMHooksThread::run() 函数中先判断出矩形区域改变的大小,然后调用NotifyHooksRegion(const Region& r)把改变的区域记录到SimpleUpdateTracker new_changes中。  NotifyHooksRegion(const Region& r) {  Lock l(hook_mgr_lock);  std::list::iterator i;  for (i=hooks.begin(); i!=hooks.end(); i++) {      (*i)->new_changes.add_changed(r);      if (!(*i)->notified) {        (*i)->notified = true;        PostMessage((*i)->getHandle(), WM_USER, 0, 0); // 把消息通知到clipper见下面一个处理函数      }  }  }  3.把更新区域拷贝到SDisplay中  rfb::win32::WMHooks::processMessage(UINT msg, WPARAM wParam, LPARAM lParam) {  switch (msg) {  case WM_USER:      {        Sleep(0);        Lock l(hook_mgr_lock);        notified = false;        new_changes.get_update(*clipper); //把更新通知到clipper中        new_changes.clear();      }      break;  }  return MsgWindow::processMessage(msg, wParam, lParam);  }  Cliper在下面设置  rfb::win32::WMHooks::setUpdateTracker(UpdateTracker* ut) {  if (clipper) delete clipper;  clipper = new ClippedUpdateTracker(*ut);  clipper->set_clip_region(clip_region);  return AddHook(this);  }  UpdateTracker* ut 为void SDisplay::start(VNCServer*vs)中设置 core->using_hooks = core->wm_hooks.setUpdateTracker(this);  4.把SDisplay中记录的数据传给VNCServerST 对象 在 SDisplay::processEvent(HANDLE event) {  try_update = flushChangeTracker() || try_update; //把变化的区域拷贝到VNCServerST中        if (try_update)          server->tryUpdate();          //把更新发送给服务器  }  flushChangeTracker()实现如下:  bool SDisplay::flushChangeTracker() {  if (change_tracker.is_empty())      return false;  change_tracker.translate(screenRect.tl.negate());  change_tracker.get_update(*server); //server 实际指向VNCServerST 对象该函数把SDisplay中的更新拷贝到VNCServerST中。  change_tracker.clear();  return true;  } 两种数据更新方式:Push机制和Pull机制  Push:  SdisplayCore 中IntervalTimer cursorTimer定时器,每隔10ms尝试着检查一下是否有更新,如果有更新就发送更新给客户端
第一步:  LRESULT SDisplayCore::processMessage(UINT msg, WPARAM wParam, LPARAM lParam) {   case TIMER_CURSOR:       display->triggerUpdate(); //SDisplay* display; }  第二步:  void SDisplay::triggerUpdate() {       if (core)           SetEvent(updateEvent); //使事件对象为受信状态  }  第三步:  SDisplay::processEvent(HANDLE event) {       if (event == updateEvent) {           if (try_update)                     server->tryUpdate(); // VNCServer* server指针 指向子类VNCServerST  }  }  第四步:向每一个连接的客户端发送更新  void VNCServerST::tryUpdate()  {       std::list::iterator ci, ci_next;       for (ci = clients.begin(); ci != clients.end(); ci = ci_next) {           ci_next = ci; ci_next++;           (*ci)->writeFramebufferUpdateOrClose();       }  } 
第五步:  void VNCSConnectionST::writeFramebufferUpdateOrClose()  {       try {           writeFramebufferUpdate();       } catch(rdr::Exception &e) {           close(e.str());       }  }  第六步:SimpleUpdateTracker updates对象记录更新的区域,如果屏幕有更新则发送更新  void VNCSConnectionST::writeFramebufferUpdate(){  if (!update.is_empty() || writer()->needFakeUpdate() || drawRenderedCursor) {           int nRects = update.numRects() + (drawRenderedCursor ? 1 : 0);           writer()->writeFramebufferUpdateStart(nRects);           Region updatedRegion;           writer()->writeRects(update, &image_getter, &updatedRegion); // SmsgWriter *            updates.subtract(updatedRegion);           if (drawRenderedCursor)                writeRenderedCursorRect();           writer()->writeFramebufferUpdateEnd();           requested.clear();       } 
}  第七步:利用RFB协议发送更新  void SMsgWriterV3::writeFramebufferUpdateStart(int nRects)  {       startMsg(msgTypeFramebufferUpdate);       os->pad(1);       if (wsccb) nRects++;       if (needSetDesktopSize) nRects++;       os->writeU16(nRects);       nRectsInUpdate = 0;       nRectsInHeader = nRects;       if (wsccb) {           wsccb->writeSetCursorCallback();           wsccb = 0;       }  }  Poll机制:客户端通过发送更新请求,请求更新某一个区域。  第一步:读取到一个更新某一个区域的请求  void SMsgReaderV3::readMsg()  {       case msgTypeFramebufferUpdateRequest: readFramebufferUpdateRequest(); break;  } 第二步:调用网络事件处理对象handler处理事件  void SMsgReader::readFramebufferUpdateRequest()  {  bool inc = is->readU8();  int x = is->readU16();  int y = is->readU16();  int w = is->readU16();  int h = is->readU16();  endMsg();  handler->framebufferUpdateRequest(Rect(x, y, x+w, y+h), inc);//handler 为 SMsgHandler* handler指针 是指向VNCSConnectionST对象  }   第三步:  void VNCSConnectionST::framebufferUpdateRequest(const Rect& r,bool incremental)  {       if (!(accessRights & AccessView)) return;        SConnection::framebufferUpdateRequest(r, incremental);       Region reqRgn(r);       requested.assign_union(reqRgn);       if (!incremental) {            updates.add_changed(reqRgn);  server->comparer->add_changed(reqRgn);       }       writeFramebufferUpdate();  }   第四步:SimpleUpdateTracker updates对象记录更新的区域,如果屏幕有更新则发送更新  void VNCSConnectionST::writeFramebufferUpdate(){  if (!update.is_empty() || writer()->needFakeUpdate() || drawRenderedCursor) {           int nRects = update.numRects() + (drawRenderedCursor ? 1 : 0);           writer()->writeFramebufferUpdateStart(nRects);           Region updatedRegion;           writer()->writeRects(update, &image_getter, &updatedRegion); // SmsgWriter *            updates.subtract(updatedRegion);           if (drawRenderedCursor)                writeRenderedCursorRect();           writer()->writeFramebufferUpdateEnd();           requested.clear();       }  }   第五步:利用RFB协议发送更新  void SMsgWriterV3::writeFramebufferUpdateStart(int nRects)  {  startMsg(msgTypeFramebufferUpdate);       os->pad(1);       if (wsccb) nRects++;       if (needSetDesktopSize) nRects++;       os->writeU16(nRects);       nRectsInUpdate = 0;       nRectsInHeader = nRects;       if (wsccb) {           wsccb->writeSetCursorCallback();           wsccb = 0;       }  } 
你看一下吧  我也是给你找的!

请问有谁知道VNC软件的源代码?

2. 怎么样在炒股软件中加入自己要的公式 源代码我有 就是不懂怎么输入其他的东西

打开软件的公式管理器。快捷键是Ctrl+F


  2.然后在打开的公式管理器中选择自己的添加的公式的类型,指标公式还是选股公式。这里      以我在网站上下载的一个选股公式(百发百中)为例讲解如何操作。


  3.我们在对应的输入框输入公式名称,是否需要密码保护 公式用法信息等。
   4.然后把公式源码粘贴到相应区域。点击右侧的测试公式按钮。如果公式无误就会显示测试    通过。如果测试出现错误的话就要查看公式哪里出错,添加的是选股公式还是指标公式。       二者不要混淆! 
   5.当公式通过以后就点击确定,公式就添加到你的软件里了。
   6.利用添加的公式选股!
注意事项
在步骤2中要注意自己添加的是选股公式还是指标公式,如果指标公式放到选股公式里会测试失败,同样选股公式放到指标公式里也会测试不过。
有时候选出的股票个数是0,是因为没有符合条件的股票,可以把选股条件放宽或者改换其他方式选股。

3. 如何在股票软件中添加股票公式,指标等?

我用的钱龙金典不支持自编指标攻能。

建议你下载大智慧或者大智慧LEVEL2(分析家内核),这两种软件自编指标功能非常简单方便。

大智慧LEVEL2
ftp://southftp.gw.com.cn/pub/Dzh_Level2_V25w.exe
大智慧V5.57 
http://www1.gw.com.cn/down/down.php?s=1

如何在股票软件中添加股票公式,指标等?

4. 我想做个股票程序,有没有可以参考的开源源代码?

估计没有,因为这种软件正是同花顺和大智慧这些上市公司赚钱的法宝,所有的证券公司和股民都用它们的软件,所以每个人下单的事情它们都知道,因此使用这些大数据统计资料包装成(像主力资金注入流出,机构入场等)各种增值服务,标价从每年几百块到十几万块不等的卖给土豪们赚钱呢。

他们怎么会把这些东西告诉你呢。

5. 股票软件的代码写好后,放在哪里

你就直接打开软件,输入代码在屏幕右下角就会显示了

股票软件的代码写好后,放在哪里

6. 我用中文编写的公式,怎么上传到股票软件上?代码怎么用?

1、首先打开通达信交易软件。
2、打开软件后,来到股票查看界面。选择左上角的“功能”--“专家系统”--“公式管理器”,或者直接按快捷键Ctrl+F键,打开公式管理器。

3、在公式管理器编辑界面,选择你要导入的公式类型,选择“其他类型”或“条件选股公式”,然后点击右上角的“新建”按钮。
4、在公式编辑界面,给公式取一个名字便于识别,对公式进行一定的描述,然后写上源代码,或者导入源代码,最后再点测试公式。看是否能测试通过。通过后,最后确定。

5、下面,利用我们制作好的公式来进行选出满足公式的股票。点击左上角的“功能”,选择“选股器”里面的“综合选股”或“条件选股”。

6、在公式中,下拉菜单,找到我们制作好的公式。

7、然后“加入条件”,点击右下角“执行选股”,数据就会开始分析。

8、你可以把得到的股票添加到自选的板块,这样数据分析完后,找到相应的板块,比如我这里添加到自选股板块中。按F6查看自选股板块,就得到了我这个公式筛选出来的股票了。



股票公式专家团为你解答,希望能帮到你,祝投资顺利。

7. 怎么在股票软件加入自己的指标.详解.谢谢.

很简单给你截几个图你可以参考下。(我的软件是 广发证券通达信版本)
1点击功能选择公式系统

 
2从公式系统右边的三角向右展开选择公式管理器 或者可以直接按 快捷键 ctrl+F
 

 
3如图就是公式编辑器 
 

 
4在公式编辑器的右边你可以自己新建 编写公式,也可以把已有的公式代入到系统中来。
如果你自己想自己编写公式可以点击  新建按钮。   如果你想代入一个公式可以点击  导入公式。按照操作步骤操作就可以了,挺简单的。

怎么在股票软件加入自己的指标.详解.谢谢.

8. 请问用航海家的源码 在其他的股票软件里怎么做公式啊?

不可以的,除非你用的软件有上阵深证数据授权,并且有指标编辑平台,否则是不可以的哦。。。。。
最新文章
热门文章
推荐阅读