存档

‘日常’ 分类的存档

C# 阻止系统待机和关闭显示器(一)

2015年8月24日 没有评论

最近衣服自己洗在开发过程中遇到一个需求就是在不修改电源管理选项的情况下,阻止系统进入休眠状态。和我们的需求比较类似的是视频播放器,在播放视频的时候,即使用户没有操作电脑,也会阻止休眠。退出播放器后,系统又正常了。

实现起来不太复杂,我们可以利用系统的API函数:SetThreadExecutionState

这个函数只有一个参数,可以选择3个值,当然值可以组合使用

只使用Continus参数时,则是恢复系统休眠策略。
不使用Continus参数时,实现阻止系统休眠或显示器关闭一次。
组合使用Continus参数时,实现阻止系统休眠或显示器关闭至线程终止。

C#的示例代码如下:
setThreadExecutionState

看着很简单,对不对。当然,如果不需要阻止显示器的关闭,则可以不传递 Display 参数即可。

批处理清空事件查看器日志

2015年8月12日 没有评论

Windows 的事件查看器对于开发人员来说比较有用,除了开发自己的日志系统外,还可以将一些信息的输出放到这里。

还记得若干年前的拨号上网时代,中国电信不允许路由器拨号,只能通过猫来拨号,这样就导致家庭里多个电脑无法同时上网。后来有网友发现电信拨号客户端有把真实的密码输出到事件查看器里。于是就方便了我们,虽然那时我还没有电脑,但是给亲戚朋友们破解使用还是蛮爽的事情。

当然,这里扯远了。回到我们的话题,日志虽然好,但是随着使用时间的增加,日志里的内容和分类也越来越多,对于我这样的洁癖者来说,及时清理日志就是一个比较麻烦的事情。

应用程序、安全、设置这3个还可以右键选择清空。但是对于应用程序和服务日志里的分类,只能遍历目录,耗时耗力。

今天让我找到了懒人的方法,放上来和大家一起分享。把下面的代码放到一个批处理文件里,要清理日志时,只需要以管理员权限运行即可。

@ECHO OFF
TITLE 清除所有事件查看器里看到的EventLog日志
FOR /F "delims=" %%I IN ('WEVTUTIL EL') DO (WEVTUTIL CL "%%I")
PAUSE

这样简直方便太多。

分类: 一句话, 日常 标签: , ,

小弹簧生病

2015年7月23日 没有评论

在这个月时候,小弹簧发烧了,第一次生病。

到半夜的时候,体温已经到达38.5度了,为了避免出问题,打算送医院。可是大半夜2、3点多的,连车都没有,小区楼下的药店晚上都不营业了,只好打120叫了一辆救护车。

夲来是打算送到积水潭的,但是打电话一问,人家没有儿科。好在人家有建议送到华医,于是又赶紧往目的地奔过去。呼叫救护车也算是一种奇特的经历吧。到了之后,一结算230。

医院的保安还是蛮不错的,前后几次告诉我们科室和路线。赞一个。

我们心急火燎的样子,怕发烧把孩子大脑烧出问题,医生到是蛮淡定的,一副见怪不怪的样子,不知道是不是他们见多了的原因。简单地询问了下,给我们开了几种药。一个狗皮膏药物理降温的,还有另外2个药。我们感觉稍微贵了点,就没有买。

处理完后,天都亮了。出门刚好碰到一个出租车,送到家才23块钱。简单买了点早点,一家人稍微休息了下,还说准备补瞌睡的,结果后来体温又上去了,到39度多了,又下楼去买药。

药买上来后,还是决定再去医院。于是在小区里又找了个黑车,给送到积水潭。到那里一打听,周末没有急诊。只好又出门找黑车重新去华医。路上心里还是蛮后悔一开始没有买医生开的药导致现在要返工。去了后重新挂号,还是开原来的药。买到手一看就是我们在小区药店里看到的那种。

吃完药出医院后等不久就来了个出租车,送回家绕了下远路,35块。

到下午的时候,小弹簧的温度就降下来了。后来就打电话把我爸从老家给叫过来了,一来是照顾下小弹簧,二来是想让他们出去玩一玩。结果来了后也没有出去玩,倒是把家里给收拾的干干净净的,那几天还一直在睡沙发。直到走之前,都没有出门吃次大餐。

分类: 日常 标签: ,

房子交付

2015年6月22日 没有评论

六月份,房子交付。从最开始决定买到现在都过去几年了。

为了最快地办好手续,特意选择了一个早上的火车,不巧的是,那天正在下雨,于是买了一把七彩虹的雨伞,心情顿时好了很多。到达地点的时候,人家都还没有上班。

预交物业管理费、填表、办理门禁卡、拿钥匙,抽奖还抽了一个拖把,到还是蛮适合的。

物业找了一个师傅陪同上楼验收。总体上来说还算可以,不过很多细节地方不是太满意。

首先发现厨房墙上的电源插排居然没有安装,这个问题比较严重,后来找电工,发现是插排的基座埋的太深了,导致螺丝不够长而安装不了,又只好在墙里填木板,把螺丝拧到木板上。但是在切割的时候,火星给飞溅到墙面上,导致很多黑点。只好又找钢丝球擦,后来发现效果不是很明显,钢丝球又把墙面给磨花了。很悲催有没有。

厨房的柜子门面上有一个地方花了,只好找人给填平,但还是看的出来。客厅地板的正中央也有一块有一个坑。可愁坏了。

阳台的门把手有生锈的地方,我怕时间长了会脱落,坚持让他们给更换了门把手。

卫生间的灯不亮了,地漏里都是建筑垃圾,不处理好将来就会是个坑。

卧室玻璃上有油漆。

总之,不那么顺利。更恼火的是保洁,磨磨蹭蹭,拖拖拉拉,最后实在是忍不住,凶了人家一顿。不过有负责陪同看家居装修的阿姨,一直很耐心地等待,带领我去看各个样板间。

有一个样板间里的装修还是蛮对我的胃口的,最后还是下了订单。又是要还好久的信用卡,有点后悔不该那么早就买的。

分类: 日常 标签: ,

Gokit 上手试用

2015年5月12日 没有评论

在几个月前,在机智云官网上申请了他们的Gokit硬件,就在快要放弃掉的时候,他们人工审核联系了我,话说妹子的音色还不错,呵呵,话题扯远了。

经过电话的简单沟通,妹子说等消息吧。然后几天前,突然就收到了他们发的邮件,提供了邀请码,迅速兑换。然后昨天就拿到了真实的机器。

不知道大家有没有注意到,上面的图中,外面的透明盒子有一面是破了个洞。我开始还以为是快递在运输的过程中给损坏了,后来一琢磨,如果这里没有洞口的话,那么 USB 线是无法接进去的。后续如果对透明盒子那一面做好加工处理就更好了,目前的方式略暴力。

点击查看大图

开箱图

点击查看大图
Gokit 2代把板子分成2块,底部为功能块,有2种版本,我拿的是ST的版本,听说是要用C语言来开发,心里有点怵的慌。上面为扩展块,扩展块上集成有wifi组件,电机,此外有温度、湿度传感器,红外传感器,还有一个小灯,还兼容Arduino,很是不错喔。按照随机附送的说明书步骤说明,开机打开airlink的时候,诶哟喂,电机转的可欢了,我在办公室顿时吓呆了。不过后来我再开机的时候,电机到是没有运转。还不清楚具体的逻辑细节。

底部的螺丝固定位置设计的很好,可以防止安装位置反向,赞一个。

在出货时,里面就已经刷了微信宠物屋的固件了,按照说明书已经成功绑定了,可以在手机上远程控制,微信里也可以看到设备当前的温湿度。

后续有什么好玩的东西我再放上来吧,我需要把他和 yeelink 放一起评测下。等我的消息吧。

分类: 日常 标签: ,

win7/8/8.1中c#附加程序到任务栏

2015年5月12日 没有评论

远的不说,自从win7开始,当应用程序可以被附加到任务栏后,任务栏就成为各个应用抢占的入口,这里可以比开始菜单更快地启动程序。后来听说微软对OEM厂商有要求,预装软件不能随便pin到任务栏上,哈哈。

今天衣服自己洗就来分享如何附加程序到任务栏上。

大致的流程是先创建一个快捷方式,然后对该快捷方式执行附加命令。附加完成后,可以删除该快捷方式,任务栏图标还是存在的。对于取消是一样的步骤,无非就是步骤不一样而已。当附加成功后,会在用户的Roaming相关目录下自动生成快捷方式,系统会使用该快捷方式,而不是前面创建的快捷方式。

命令就是动作谓词,常见的谓词有run、open等操作,而附加和取消的谓词就是TaskbarPin/TaskbarUnPin,从实际经验来看,谓词是不区分大小写的。代码很简单,看看就明白了。
先申明操作的返回值枚举

public enum FileResult
{
Success,Failed,Exist,NotExist
}

附加到任务栏

public static FileResult PinToTaskBar(string linkPath, bool deleteLink = false)
{
if (!File.Exists(linkPath))
{
// 快捷方式不存在
return FileResult.Failed;
}

string name = System.IO.Path.GetFileName(linkPath);
string userPath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile, Environment.SpecialFolderOption.None)
+”\\AppData\\Roaming\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar\\”;

if (File.Exists(userPath + name))
{
//当pin到任务栏后,该目录下会生成对应的快捷方式。
//通过判断该文件是否存在判断是否已经pin到任务栏
return FileResult.Exist;
}

ProcessStartInfo psi = new ProcessStartInfo(linkPath);

psi.Verb = “TaskbarPin”;
Process.Start(psi);

if (deleteLink)
{
//pin 完后删除快捷方式
File.Delete(linkPath);
}

return FileResult.Success;
}

取消附加到任务栏

public static FileResult UnPinToTaskBar(string linkPath, bool deleteLink = false)
{
if (!File.Exists(linkPath))
{
// 快捷方式不存在
return FileResult.Failed;
}

string name = System.IO.Path.GetFileName(linkPath);
string userPath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile, Environment.SpecialFolderOption.None)
+ “\\AppData\\Roaming\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar\\”;

if (!File.Exists(userPath + name))
{
//当pin到任务栏后,该目录下会生成对应的快捷方式。
//通过判断该文件是否存在判断是否已经pin到任务栏
return FileResult.NotExist;
}

ProcessStartInfo psi = new ProcessStartInfo(linkPath);

psi.Verb = “TaskbarUnPin”;
Process.Start(psi);

if (deleteLink)
{
//pin 完后删除快捷方式
File.Delete(linkPath);
}

return FileResult.Success;
}

完整的代码如下图所示。

pin2TaskBar

 

在执行附加操作的时候,如果任务栏上已经附加了,执行谓词命令就会失败。同理,如果任务栏上没有,执行取消附加也会失败,所以就需要做一个判断,只在必要的时候来做判断。并根据不同的情况返回不同的枚举。

分类: 日常 标签: , ,

c++和c#相互调用dll

2015年5月5日 评论已被关闭

前不久昊问起来如何让c++和c#相互调用dll,后来专门去搜索了下,现在衣服自己洗分享出来,可能对大家有帮助。
首先我们来说c#调用c++编译的dll。这个网上已经很多了,c++里和普通写法一样,设置导出函数等等,例如c++里有一个函数 int cplusplus(int a,int b),那么在C#里,可以先申明:

[DllImport (abc.dll)]
public extern static int cplusplus(int a,int b);

然后就可以像普通的C#函数一样调用了。有几个需要注意的地方,
1、DllImport 后括号里输入c++ 的dll 的文件名,如果该dll不是在系统目录或者环境变量的目录,或者是c#程序的bin目录里,这里就应该输入完整的路径。建议放到c#的bin目录里。
2、函数必须声明为public的,不要忘记了extern关键字,当然static也所必需的。
反过来,c++是如何调用c#的dll呢,例如c#里有一个函数 public int csharp(int a,int b)在类Pipe下,而Pipe类属于ABC命名空间,那么对于c++项目,首先应该设置项目属性,打开公共语言运行时支持,即/clr标记,然后c++项目中添加c#的dll文件引用,接下来,在cpp文件里添加c#对应函数的命名空间 using namespace ABC;最后就是在需要调用的地方,使用托管代码的方式调用:

Pipe ^p = gcnew Pipe();
int a = p.csharp(3,4);

网上有同学提及编译失败,有一种可能是没有添加dll的引用,如果不喜欢添加引用,那么在cpp 文件里,使用 #using “..\Debug\csharp.dll” 也是一样可以的,不过这里就是用using,而非 include关键字,当然绝对路径也是不可少的。

现在c++和c#相互调用dll的方式就算完成了,有的同学对c++调用c#的dll的方式不太认可。为什么呢,因为要用托管代码的方式。其实上面描述的方法,本质上是使用的COM调用来完成的,微软也给出了直接COM调用的示例,喜欢这种方式的同学不妨琢磨下。

分类: C++, 日常 标签: , ,

在控制面板中添加图标

2015年4月17日 没有评论

如果你的机器上安装了Java,那么会在控制面板上出现一个图标,点击图标后会弹出对话框来进行相关的设置。除了Java外,还有显卡、声卡等都是一样一样的。

对于有的应用程序,除了自身的主逻辑外,有时候还需要在控制面板添加入口,方便用户设置。例如一个windows系统服务,如果单独创建一个快捷方式的话,会被众多其它程序淹没在程序列表中。

我们在实现这个功能的时候,有去网上搜索一番,发现几乎全部都是用VC6或者C++ Builder来实现,一来是由于这些开发环境过于久远,在目前最新的win10系统中可能无法得到验证。另外的原因就在于目前还没有驾驭C++,所以自然想着有没有什么好的替代方案。C++的实现方案是使用cpl文件来达到目的,我们有机会单独展开说。

这里我们使用微软新推荐的方式,注册表,方便简单。

首先我们准备一个exe程序,举例叫做 Profile.exe 吧,然后利用工具生成一个GUID,比如叫做{49E28756-FD3A-4977-8758-AAF2BB10997C}好了。

接下来,我们在注册表HKEY_LCOAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace路径下新建一个子键项,名称为刚才我们生成的GUID,给这个项的默认值(Default)赋值,例如Profile。

第三步,在注册表HKEY_CLASSES_ROOT\CLSID下新建一个项,名称为刚生成的GUID,设置其默认值(Default)为Profile,这里建议和上一步设置的文字保持一致。添加字符串键LocalizedString、InfoTip、System.ApplicationName、System.ControlPanel.Category、System.Software.TaskFileUrl,并为它们设置值。LocalizedString是在控制面板里显示的字符,可以使用程序里的资源,例如 @%ProgrameFiles%\Profile.exe,-9 。InfoTip是指在控制面板上鼠标划过对应项时出现的浮动提示内容。System.ApplicationName是程序的调用名称,比如说该值为 Laodaoxia.Profile,那么就可以通过“control.exe /name Laodaoxia.Profile”命令来打开控制面板的这个程序。System.ControlPanel.Category是描述应用程序图标在控制面板里出现的位置,其取值范围为0-11,其中0为在所有项目中显示,1为外观和个性化,2硬件和声音,3为网络和Internet,5为系统和安全,6为时钟、语言和区域,7为轻松使用,8为程序,9为用户账户。其它枚举数值不推荐使用,一般为“1,8”。如果要选择多个,可以用英文逗号分割。

第四步,在注册表HKEY_CLASSES_ROOT\CLSID\{GUID}下新建子键DefaultIcon,设置其默认值(Default)为图标资源,例如%ProgramFiles%\Profile.exe,-2 。这里的{GUID}是第一步创建的GUID,请替换这个占位符。在{GUID}下继续创建 Shell\Open\Command 子键,设置 Command的默认值(Default)为 %ProgramFiles%\Profile.exe。熟悉windows和注册表的同学们一看就知道了,这里就是设置当点击控制面板图标的时候,所运行的具体程序路径,可以带参数哟。

接下来,我们打开控制面板,就可以发现图标已经出现在我们期待的位置上了。

更多信息,可以访问微软MSDN的相关文档

香蕉派(Banana Pi)使用红外IR之安装篇

2015年4月6日 2 条评论

在前面的文章中,衣服自己洗分享了香蕉派(Banana Pi)上关于语音合成的经验,这次就说一说红外线的事情。

香蕉派上已经内置了红外接收装置,硬件是已经有了,这篇文章就来说一下软件的安装。

首先运行

sudo apt-get install lirc

lirc 是一个开源的红外控制软件,安装完成后,修改 /etc/lirc/hardware.conf文件内容,如下

REMOTE=”None”
LOAD_MODULES=true
MODULES=”sunxi-ir”
REMOTE_DRIVER=”devinput”
REMOTE_DEVICE=”/dev/input/event0″
REMOTE_LIRCD_ARGS=””
REMOTE_LIRCD_CONF=””
REMOTE_LIRCMD_CONF=””

上面的内容是专为香蕉派调试出来的,其它的比如说树莓派什么的需要做下调整。

接下来就是拿出你的红外遥控器,香蕉派只能识别出部分的遥控器,我的联想Y450送的遥控器就不支持,反而arduino套件里几块钱的反而可以识别出来。要判断是否可以识别出来,可以运行下面的命令,没有的话就安装下

sudo evtest

接着就按键,如果命令行里有反应,就表示可以识别出来这个红外遥控器。

现在就是准备记录遥控器的命令了,先从lirc那里下载一个通用的版本,

wget http://lirc.sourceforge.net/remotes/generic/NEC.conf

然后呢,就是记录按键,运行命令

irrecord -H devinput -d /dev/input/event0 NEC.conf

这里需要说明下步骤,运行完命令后,首先是提示你按回车继续,然后按照提示,让你先输入按键名称,回车,会提示你按下遥控器对应的按键,接着循环往复只到全部输入完,以回车结束输入。

按键名称不能随便乱写,只能是KEY_1 这样可以识别的,如果要获取可用的名称,可以使用 irrecord -l 命令查看。最后NEC.conf文件里的按键部分,类似下面:

ir

各位同学生成的  0x01000C00000001 这样的字符应该有两列,应该删除后面的一列。后面估计是按键松开的编码。

删除后保存,把文件的内容拷贝到 /etc/lirc/lircd.conf文件里,因为有人说lirc编译代码里是识别固定的文件名。

最后,重启lirc,

sudo /etc/init.d/lirc restart

重启完成后,我们可以来验证是否可以了,运行

irw

按下遥控器上刚才配置的按键,如果出现了内容,就表示配置成功了。截图大致是这样的

irw

到此,香蕉派(Banana Pi)使用红外IR的安装就算完成了,后面的部分就是和程序关联应用了。

 

Linux中访问USB摄像头

2015年3月5日 没有评论

衣服自己洗的香蕉派是基于Lubuntu的arm系统,在前几天刚完成语音合成的技术难题。今天头脑发热,就想看看视频这块。

其实在衣服自己洗的另外一个香蕉派上,已经有一个处理模块了。定时每2分钟,从局域网里的摄像头上获取图片,并上传到yeelink上。当初写这个模块是为了熟悉物联网的概念,所以视频图片并不是从本机获取的。

恰好手头上有一个几年前淘汰的USB摄像头,打算用来练练手。
首先插上USB摄像头,然后运行命令

ls /dev

如果USB摄像头被识别的话,里面应该可以看到video0。

接着查看当前的USB设备

lsusb

我这里运行结果如图所示:

lsusb如红线标记,Z-Star传说是国内比较大的山寨厂商,记录摄像头设备的硬件ID,0ac8:303b,然后访问http://mxhaard.free.fr/spca5xx.html查看spca5xx是否支持你的USB摄像头。

接下来安装camorama,

sudo apt-get install camorama

接下来,可以在远程桌面里访问这个程序,当然香蕉派系统自带的guvcview程序也是可以查看视频的。网上也有下面的方式

sudo apt-get install mplayer

sudo mplayer tv://

不过衣服自己洗用这个方式虽然可以查看视频,不过有一些错误信息。

如果各位同学的摄像头不是免驱动的话,要么就是下载对应的驱动安装,不过最快的就是换个别的型号的摄像头。

分类: 一句话, 日常 标签: , ,