启动VNC Shell扩展
Introduction 我们使用RealVNC来远程控制我们的网络中的pc机,VNC是一个伟大的产品,但如果不记住计算机名称,它可以是乏味的,在网络邻里找到计算机,然后复制计算机名称到VNC连接屏幕,所以我开发了这个Shell扩展。 VNC是什么? 从RealVNC网站: VNC代表虚拟网络计算。它是一种远程控制软件,允许你使用一个简单的程序(“查看器”)在互联网上任何地方的另一台计算机上查看和交互一台计算机(“服务器”)。这两台计算机甚至不必是同一类型的,因此,您可以使用VNC来查看您家里的Windows PC上的office Linux计算机。VNC是免费和公开可用的,并在广泛活跃使用的数百万人在整个工业,学术界和私人。 RealVNC可以在这里下载。 创建一个扩展 首先我要感谢Michael Dunn所做的一切努力,特别是他的教程:编写Shell扩展的完整傻瓜指南第一部分。我将它作为我的扩展的起点。 我按照他的步骤创建了他的扩展演示,然后更改了他的初始化接口代码来处理网络资源,而不是文件名。 CFSTR_NETRESOURCES 在传输网络资源(如域或服务器)时使用此格式标识符。数据是一个包含全局内存对象的STGMEDIUM结构。结构的hGlobal成员指向一个NRESARRAY结构。该结构的nr成员表示一个NETRESOURCE结构,其lpRemoteName成员包含一个以null结尾的字符串来标识网络资源。 我们必须使用RegisterClipboardFormat API函数(提供CFSTR_NETRESOURCES作为参数)来获得用于网络资源的shell注册剪贴板格式。然后我们可以在NRESARRAY结构的nr成员中从第一个NETRESOURCE结构中提取所选项目的名称。 我们检查资源的类型,因为我们只对服务器感兴趣。成员dwDisplayType包含资源的类型。隐藏,复制Code
if(pNtary->nr[0].dwDisplayType == RESOURCEDISPLAYTYPE_SERVER)
NETRESOURCE结构中的字符串成员包含偏移量而不是地址! 因此,我们通过将结构转换为char指针来获得所选的名字,然后向指针添加偏移量,然后将其转换为WCHAR指针。隐藏,复制Code
WCHAR* pwchRemoteName = (WCHAR*)((char*)pNtary +
int(pNtary->nr[0].lpRemoteName));
我们从返回名称的开头删除\\,并将其存储在m_szPCName成员变量中以供以后使用。隐藏,收缩,复制Code
STDMETHODIMP CVNCShell::Initialize(LPCITEMIDLIST pIDFolder,
IDataObject *pDataObj,
HKEY hRegKey)
{
HRESULT hr; if (pDataObj)
{
STGMEDIUM medium;
FORMATETC fe;
fe.cfFormat = RegisterClipboardFormat(CFSTR_NETRESOURCES);
fe.ptd = NULL;
fe.dwAspect = DVASPECT_CONTENT;
fe.lindex = -1;
fe.tymed = TYMED_HGLOBAL; hr = pDataObj->GetData(&fe, &medium);
if(SUCCEEDED(hr))
{
LPVOID lpv = GlobalLock(medium.hGlobal);
if (lpv)
{
LPNRESARRAY pNtary = (NRESARRAY*)lpv; m_bShowMenuItem = false; if(pNtary->nr[0].dwDisplayType == RESOURCEDISPLAYTYPE_SERVER)
{
m_bShowMenuItem = true; // The string members in the structure
// contain offsets instead of addresses!
WCHAR* pwchRemoteName = (WCHAR*)((char*)pNtary +
int(pNtary->nr[0].lpRemoteName)); // Copy name, minus \\ at begining of name, to local variable
lstrcpynW (m_szPCName, pwchRemoteName + 2,
lstrlenW(pwchRemoteName) * sizeof(TCHAR));
} GlobalUnlock(medium.hGlobal);
}
else
hr = E_UNEXPECTED; ReleaseStgMedium(&medium);
}
}
return hr;
}
我也改变了InvokeCommand界面显示一个对话框的代码替换为VNC程序执行的代码,这个假设VNC提供程序是安装在固定的路径,在本例中它总是安装,我们通过m_szPCName成员变量包含我们之前存储的电脑名称。隐藏,复制Code
ShellExecute (pCmdInfo->hwnd, _T("open"),
_T("C:\\Program Files\\RealVNC\\vncviewer.exe"),
m_szPCName, NULL, SW_SHOWNORMAL); return S_OK;
注册shell扩展 Shell在HKEY_CLASSES_ROOT下定义了其他对象,可以按照与文件类型相同的方式扩展这些对象。 我们唯一感兴趣的是网络\Type\2子键: HKEY_CLASSES_ROOT \网络\ \ 2 \ ShellEx \ ContextMenuHandlers \ VNCShellExt类型 从MSDN: "对于Network\Type\#, "#"是十进制的网络提供程序类型代码。网络提供者类型代码是网络类型的高级字。网络类型的列表在Winnetwk.h头文件中给出(WNNC_NET_* values)。 所以我把注册表资源从文本文件改为:复制Code
NoRemove Network
{
NoRemove Type
{
NoRemove 2
{
NoRemove ShellEx
{
NoRemove ContextMenuHandlers
{
ForceRemove VNCShellExt = s '{B9442EFE-9815-4046-B6FF-4F3606291D8E}'
}
}
}
}
}
就这样,这是我第一次尝试写这篇文章,而且我用c++编程的时间很短,请不要客气:) 参考文献 Michael Dunn的教程:完整的白痴指南编写Shell扩展-第一部分&第二部分 创建Shell扩展处理程序,Shell剪贴板格式 本文转载于:http://www.diyabc.com/frontweb/news30072.html
启动VNC Shell扩展的更多相关文章
- 常用的GNOME Shell 扩展
GNOME Shell(即GNOME 3)桌面环境最初进军Linux世界时,众多批评人士指出其灵活性有所欠缺.当初外观有所突破的GNOME确实会给生产效率带来一些影响,然而它多年来一直默默通过多种方式 ...
- 如何使用 GNOME Shell 扩展
如何使用 GNOME Shell 扩展 作者: Abhishek Prakash 译者: LCTT MjSeven | 2018-03-15 10:53 评论: 1 简介:这是一份详细指南,我将会 ...
- 【转】Linux学习之路--启动VNC服务
我的Linux是Fedora 13,安装方法如下: 1.打开终端,执行 # yum install -y tigervnc tigervnc-server 2.编辑/etc/sysconfi/vncs ...
- Linux学习之路--启动VNC服务
我的Linux是Fedora 13,安装方法如下: 1.打开终端,执行 # yum install -y tigervnc tigervnc-server 2.编辑/etc/sysconfi/vncs ...
- ANDROID 开机启动VNC SERVER
ANDROID 开机启动VNC SERVER 背景信息: 最近在做一个项目,在项目需求中有这么一项“要把VNC SERVER 添加到android里并让其开机自启动”.其实做这个项目也挺缚手缚脚的,因 ...
- 启动MongoDB shell客户端会什么会一闪而过
解决办法: 在MongoDB shell客户端根目录下右击选择 "在此处打开命令窗口"; 在命令窗口敲入mongod --dbpath=d:/mongodb/data ; //我的 ...
- Hbase启动hbase shell运行命令报Class path contains multiple SLF4J bindings.错误
1:Hbase启动hbase shell运行命令报Class path contains multiple SLF4J bindings.错误,是因为jar包冲突了,所以对于和hadoop的jar包冲 ...
- Xvfb新建虚拟X窗口,通过x11vnc启动VNC Server并转发Xvfb启动的虚拟窗口
远程运行Linux窗口程序使用X Windows太重量级了,可以使用Xvfb新建虚拟X窗口,通过x11vnc启动VNC Server并转发Xvfb启动的虚拟窗口. 1 2 3 4 5 6 7 8 yu ...
- Windows Shell编程之如何编写为文件对象弹出信息框的Shell扩展
有关COM编程资料 转载:http://www.cnblogs.com/lzjsky/archive/2010/11/22/1884702.html 活动桌面引入一项新特性, 当你在某些特定对象上旋停 ...
随机推荐
- unity 对Animator动画系统的研究
unity的新动画系统叫Mecanim,使用Animator来取代旧系统Animation,按Unity文档的惯例:知识点主要分2部分:unity manual和unity script,读者可以边看 ...
- unity3d android动态更新dll
基本是参考这篇文章:http://blog.sina.com.cn/s/blog_9e5d42ee0102vvtg.html,进行了增删一波. 大略说一下基本步骤:1.下载mono源码,修改源码,编译 ...
- The Triangle (简单动态规划)
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a program that calc ...
- bootstrap-table存在合并单元格怎么处理数据
效果如图: js文件如下: $(function () { initTable() $('#load_vip').change(function () { $ .ajax({ type: 'POST' ...
- 一文读懂神经网络训练中的Batch Size,Epoch,Iteration
一文读懂神经网络训练中的Batch Size,Epoch,Iteration 作为在各种神经网络训练时都无法避免的几个名词,本文将全面解析他们的含义和关系. 1. Batch Size 释义:批大小, ...
- 利用ANSI转义序列在控制台输出彩色文字
说明:无论什么语言,只要你的终端能够解释ANSI转义序列(大多数的类unix终端仿真器都能够解释ANSI转义序列,win32控制台则不支持),就能够使用ANSI转义序列输出颜色.这个功能看似鸡肋,但只 ...
- Apache2.4 下载和安装 - Win10
Apache安装包已放入百度网盘,链接地址在本文最后 1.下载Windows版本的Apahce安装包 a. 访问官网,进入下载页面 https://www.apachelounge.com (apac ...
- 【微信小程序】常用组件及自定义组件
(一) 常用标签 组件你可以理解为传统页面开发时候的各种标签,例如 div span 等等,我这里只说一些常用的,这样就能能搭建出一个基本的页面了,但是如果想要更加美观以及拥有更好的体验,就需要 XS ...
- 架构设计 | 基于Seata中间件,微服务模式下事务管理
源码地址:GitHub·点这里 || GitEE·点这里 一.Seata简介 1.Seata组件 Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata将为用 ...
- 一篇文章说清楚TDengine的FQDN
TDengine2.0以后需要使用FQDN来进行访问.小朋友,你是否有很多小问号:什么是FQDN,为什么要配置FQDN,如何配置FQDN.我们今天来简单讲一下.心急的小伙伴,可以直接跳转到配置章节. ...