nonocast

Digital Life

Browsing Posts tagged Tip

PowerPoint很容易在Slide中插入一个Video,但Video和Image不同的是,Video属于外部链接,不像Image会嵌到ppt(x)文件中。
换句话说,如果仅仅将ppt(x)文件给别人(usb-key或是mail),那么别人是无法看到其中的Video的。
做了几个小的实验,发现如下现象:
1. ppt(x)中会记录Video的LocalPath,如果你将你电脑上的D:\videos\test.wmv放入这个ppt(x),那么ppt(x)会记住这个路径。
2. 如果你把D:\videos\test.wmv删除,那么ppt(x)则无法播放这个Video。
3. 如果你把D:\videos\test.wmv剪切(cut)到ppt(x)所在目录,则又能播放。
4. 如果你把另外一个video以test.wmv的名字放到ppt(x)所在目录,并且把D:\videos\test.wmv删除,则ppt(x)播放替换的Video。

有点绕,其实就一句话,
当你给别人PowerPoint的时候,除了采用Publish CD的方式,同样可以将Video copy到ppt(x)同一目录下解决Video Link的问题。

该有的都有了,包括了WM_*和参数Enum
Win32.cs
鼠标键盘模拟操作
Simulation.cs
鼠标键盘Hook
MouseKeyboardHook.dll

通过VS2010创建Windows Service真的很简单,看图说话,

然后在OnStart和OnStop中填空即可,第二部是配置Service,通过在Service的Design视图右键Add Installer,然后打开Installer进行配置,如图,

Build后就生成了service的exe,这里提一下和非service exe的区别,
1. 不能F5直接运行,需要通过命令行安装到service中,如下:
installutil YourService.exe
卸载service
installutil /u YourService.exe
你可以通过bat来制作安装/卸载的script
2. ‘运行’中输入services.msc可以快速打开’服务’控制台
通过命令’net start YourService’启动你的service,反之’net stop YourService’来关闭。
3. 很多TX抱怨service会很隐晦,不方便调试之类的,童鞋,请使用微软牌日志,药到病除。

如果一个目录文件如下:

  • 幻灯片1
  • 幻灯片2
  • 幻灯片3
  • 幻灯片4
  • 幻灯片10
  • 幻灯片11
  • 幻灯片12

在程序中当你需要枚举显示这些文件时,写下如下代码:

foreach (var each in Directory.GetFiles(@"c:\theFolder")) {
	Console.WriteLine(each);
}

显示结果不能说奇怪,只是说一定和你期望值有差距,如下

  • 幻灯片1
  • 幻灯片10
  • 幻灯片11
  • 幻灯片12
  • 幻灯片2
  • 幻灯片3
  • 幻灯片4

怎么解决?竟然需要动用API, StrCmpLogicalW
增加Sort,如下

List files = new List(Directory.GetFiles(@"c:\theFolder"));
files.Sort(new StringLogicalComparer());
foreach (var each in files) {
	Console.WriteLine(each);
}

StringLogicalComparer代码如下:

public class StringLogicalComparer : IComparer {
	[DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
	public static extern int StrCmpLogicalW(string x, string y);

	public int Compare(string x, string y) {
		return StrCmpLogicalW((string)x, (string)y);
	}
}

Everything is OK. Enjoy it.

BItmapImage默认情况下是不会进行Preload,之前google竟然也没有什么办法,本来考虑尝试一下thumbnail,隔天再想这个问题突然灵光一闪,Yes,MemoryStream。

<MediaElement x:Name=”video” MediaEnded=”video_MediaEnded” Stretch=”Fill” LoadedBehavior=”Manual” />
增加MediaEnded事件响应,事件响应代码如下:

private void video_MediaEnded(object sender, RoutedEventArgs e) {
	this.video.Position = TimeSpan.FromSeconds(0);
	this.video.Play();
}

关键是需要重置video的Position。

string path = @"D:\Snow.Leopard\Snow-Leopard-Prowl.jpg";
Console.WriteLine(File.Exists(path));
Console.WriteLine(File.Exists(new Uri(path).LocalPath));

string uri = @"file:///D:/Snow.Leopard/Snow-Leopard-Prowl.jpg";
Console.WriteLine(File.Exists(uri));
Console.WriteLine(File.Exists(new Uri(uri).LocalPath));

Output:

  • True
  • True
  • False
  • True

PowerPoint 2007另存为图片后发现文字边缘存在明显锯齿,而且最奇怪的事情是同样的PPT有些机器好有些机器不好,折腾了一个晚上,OMG,原来没有打SP2.
解决方法说来也无比简单,不过如果能上手就意识到版本问题可能就不会兜那么大一圈了,从字体折腾到显卡最后才发现是SP的问题。请一定记得在解决问题前核对版本号。

前面文章还说PowerPoint转图片无话可说,因为没有任何设置给到我们,今天又是无意搜到PowerPoint导出TIF改分辨率
在HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\PowerPoint\Options下增加ExportBitmapResolution(DWORD值),11.0针对2003,12.0针对2007
可选值分别是: 50,96(Default), 100, 150, 200, 250, 300.对应关系如下(dpi->pixel):

  • 50 500×375
  • 96 960×720
  • 100 1000×750
  • 150 1500×1125
  • 200 2000×1500
  • 250 2500×1875
  • 300 3000×2250

设为300后启动PowerPoint另存为png,出来的图片分辨率是3000×2250。
我的Office版本: Office 2007 Plus
BTW: 官方版本

转换PowerPoint的动作无非是利用Microsoft.Office.Interop.PowerPoint,后面就不说了,因为没有话可以说,SaveAs就是了。
But图片质量你就不用操心了,因为操了也是白操,不给设置啊!!
codeproject上竟有达人通过截屏这种下三滥的手法得到高分辨率的图片,我也算服了,如果没有记错,应该是3年前看的那篇文章,3年中没有再看到更好方法来获取高分辨率的图片,3年中竟然时不时还去忽悠别人一把,=.=|||
But前面装了Acrobat Pro,于是顺便将一个打开的PowerPoint转成Pdf,打开发现Pdf保持矢量形态,导出成图片,COOL,2200×1650,如果只是PowerPoint的另存为分辨率只有960×720。3年的问题就在不经意间化解了,想想有点意思。