Thursday, October 27, 2011

Chrome商店更新

界面非常难看。这个可以忍。
评论居然每个人只能添加一条??不能匿名????评论必须评分??????

Saturday, October 08, 2011

替换网页字符中的中文部分为微软雅黑的插件

想必有这个要求的基友还是不少的吧,但是比如俺就有一些特别的要求,就是还想尽量知道网页的原貌。其实大概就是只要把宋体、黑体这两个看起来不太爽的字体换掉就可以了。而且,雅黑的英文部分实在不高明,最好还是英文字体用一个其他的。
日文插件“強制メイリオちゃん MSゴシック置き換え版”中给出了一个较为完美的方法。依据其中的资料可以较容易地写出适合中文网站的情况。效果应该比现在常用的几个插件好一点。
插件在Google商店里面发布,地址如下:
替换字体的中文部分为雅黑

Saturday, May 14, 2011

C#编写IE插件的一些经验

1. BeforeNavigate2不发生

在C#中这个事件好像是有问题,一直没有被触发过。这个有可能是.NET Framework 4.0的bug,因为在C++中调用这个事件是有效的。

除了等微软发补丁,我们自己没什么解决办法。

2. 多个NavigateComplete2DocumentComplete的问题

这个问题的一般结论是,在载入多个框架的网页时,每个框架都会引发自己的NavigateComplete2和DocumentComplete事件,判断该事件是否为主框架的对应事件可以用以下代码:

        void ieInstance_NavigateComplete2(object pDisp, ref object URL)
{
if (pDisp == ieInstance)
{
//Do something.
}
}

其中ieInstance为public对象,而SetSite中将其指定:

        public InternetExplorer ieInstance;
        ieInstance = (InternetExplorer)site;

可以认为是该IE窗口(或选项卡)对应的对象。

但是在某些复杂页面上,该事件似乎会被触发多次。在大部分网页上应该是只触发一次的。

3. 如何判断点击刷新按钮事件

其实我觉得Chrome的作法比较奇怪,在网页加载过程是不能刷新的,这个细节非常有趣。

因为我编写的BHO主要是设置网页元素事件,而这类事件会在刷新之后失效,因此我需要捕捉按刷新页面这个事件。

网页刷新过程中,NavigateComplete2和DocumentComplete都是不会发生的。同时IE并未提供这个按钮的事件,因此有很多不太正规的方法去判断。MSDN上说的是,如果一个DownloadBegin之前是DocumentComplete,那么该DownloadBegin应该是由刷新按钮触发的。

这个方法是不正确的,事实上我已经观测到很多网页在加载的过程中,DocumentComplete之后还有DownloadBegin。这多半是因为页面上有一些额外的元素,例如漂浮的图片广告之类。同时,该方法对于在加载过程中刷新,或者是刷新之后再刷新都是无效的。

我曾经用过一个方法,基于一个可能性较大的猜测:DownloadBegin必然有接下来的DownloadComplete,即使操作被挂起。那么,DownloadComplete之后呢?一般来说应该是紧接着一个新的DownloadBegin,如果没有,就是网页加载完毕了。据此,可以记录下每个DownloadComplete发生的时间,如果某一个DownloadBegin发生时,在其之前一定时间之内没有任何事件发生,即可以认为这个DownloadBegin是由刷新按钮触发的。

但是这个方法也有相当的缺陷,首先是间隔时间长度,设得太短容易误判,太长容易没反应,毕竟是基于人们浏览网页的习惯。此外,有一种特殊情况,就是在网页加载过程中刷新,很明显这种方法是不行的。

不过后来很意外,我发现网页元素在刷新后失效这个特性可以利用一下,具体的方法如下:

定义public变量:

        public IHTMLDocument3 document;
public HTMLElementEvents2_Event rootElementEvents = null;

在NavigateComplete2中将网页元素事件指定:

        document = ieInstance.Document as IHTMLDocument3;
rootElementEvents
= document.documentElement as HTMLElementEvents2_Event;

在DownloadBegin中添加如下代码:

        if (rootElementEvents != document.documentElement as HTMLElementEvents2_Event)
{
//This might be refreshing, if no navigations.
}

该if语句就是判断rootElementEvents是否跟ieInstance挂钩,刷新之后既然不挂钩了,那么该判断为真时,就可以认为是用户刷新了网页。而为了使该判断仍然可以使用,之后需要在立刻在下一个DownloadComplete重新将二者挂钩。

该方法对任何时候的刷新都有效,但是有时在打开新页面时也会发生,可以通过一些小手段处理。

4. 避免网页元素事件的重复设定

用户打开一个选项卡之后,所进行的操作是难以估计的,有可能是重新打开该页面,刷新该页面(以上二者是不同的),从该选项卡打开新页面等等。一般来说,我们需要每次重新导航或者刷新之后,重新设定网页元素的事件。

正是因为IE没有刷新事件的接口,因此重新设定的适合时机不太容易抓住,前面所说的判断刷新的方法虽然有效,但是却不太容易将它与新的导航区分开来。而刷新和重导航是都需要设定事件的,这时就可能发生重复设定。

如果需要设定的事件并没有什么明显的操作,那很多时候倒也无关痛痒。但是如果操作是可见的,那么重复设定的后果就是可见操作会发生两次甚至更多次。例如在本例中,需要对鼠标的拖拽事件进行设定,可以拖拽出新的选项卡,那么重复设定就会导致一次拖拽出现两个甚至更多个新选项卡,这显然是我们不愿意看到的。

如果实在太难以区分,那么就干脆不要区分而采用其他的手段。在设定事件之前,首先清除前一个事件,即:

        rootElementEvents.ondragend -=
new HTMLElementEvents2_ondragendEventHandler(
Events_Ondragend);
rootElementEvents
.ondragend +=
new HTMLElementEvents2_ondragendEventHandler(
Events_Ondragend);

在设定之前首先清除,即可以保证事件只被设定一次,rootElementEvents应该是一个public的全局变量,而不是单属于这个函数。因为-=操作在相关事件没有设定的时候是不做操作,所以首次设定也不会有错误发生,该方法被证实是比较有效的。

Wednesday, May 11, 2011

How to check the clicking of "Refresh button" in a Browser Help Object with C#

How to check the clicking of "Refresh button"

It is not a good experience.

In the versions of 0.9.2.x, the event handler was set many times at each "DownloadComplete". But in fact once is enough, too many times will reduce the loading speed indeed.

The reason is that we cannot catch the clicking of "Refresh button", I have no idea that why Microsoft never leave this interface, it is very bad.

Unexpectedly, I found this code is helpful:

//in NavigateComplete2 or other place:
document
= ieInstance.Document as IHTMLDocument3;
rootElementEvents
= document.documentElement as HTMLElementEvents2_Event;

Then when the refresh button is clicked:

//place this code in DownloadBegin
if (rootElementEvents != document.documentElement as HTMLElementEvents2_Event)
{
MessageBox.Show("You might click the refresh button just now");
}

The new tab and event handler

A new tab opened by clicking the URL (or clicking a URL with middle button, or right button then select "open in new tab"), cannot be set event handler in 'NavigateComplete2', but "DownloadComplete" is OK.

It is not right in "NotGood".

Conclusions

We can drop re-navigating, cut down the times of handler setting.


Super Drag and Go (0.9.5.0 beta) for IE9

超级拖拽插件(0.9.2.3 beta) for IE9

What's new:
0.9.2.2

You can still use "super drag" after refreshing the page.
In fact, the code has been written in 0.9.2.1, but was palced into a wrong position.
Additionally, the ZIP file for manually installation was bad, I have upload a right one to instead it.

更新在刷新页面之后仍可以使用拖拽。
其实实现这个功能的代码在0.9.2.1中已经写出来了,只是放错了位置,我在测试时也一直没注意到。此外,之前的手动安装文件是错误的,已经更正了。

0.9.2.3

Search string can be recognized by search engineering when language is not Simplified Chinese or English.

搜索字串可以在搜索引擎的设置非简体中文或英文时正确识别。

0.9.5.0

Re-navigating when open a new tab was removed. The times of handler setting was reduced.

修改了设置事件的方式,打开新选项卡不需要重新导航,设置事件的次数减到很少。


Tuesday, May 10, 2011

记念一些逐渐消失的软件

有些软件是我们以前安装电脑时必须首先考虑安装的,现在它们都很少见了。

随便写一点,记念一下这些软件。

 

Net Ants

作为多线程下载的开山鼻祖之一,Net Ants已经消失很久了,取代它的是FlashGet以及泛滥的迅雷。

至于后来者的优点,当然是更快。

CCED

在DOS时代曾经辉煌一时的CCED现在已经找不到了。最夸张的是它的主页现在乱得厉害。

Winamp

MP3的代名词,现在你还用它吗?

现在的播放软件都是些高大全的东西,比如微软的WMP,苹果的iTunes,还有啥?

金山游侠

游戏玩家必备。不过现在的游戏都有专用修改器??

KILL

公安部认证的杀毒软件,现在不知还更新不。

东方快车

Unicode是个好东西,于是转码软件失业了。

Monday, May 09, 2011

Super Drag and Go (Beta) for IE9

Super Drag and Go (Beta) for IE9
超级拖拽(beta) for IE 9

作者: s.weyl版本: 0.9.2.1 (beta)

如果你知道超级拖拽是什么,那么你可能需要这个插件。你可以用电子邮件向我查询或者索要源码(scarsty@gmail.com)。

1. 如何安装和卸载

首先需要你的系统中安装了.NET Framework 4.0 Client,可以在 http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e5ad0459-cbcc-4b4f-97b6-fb17111cf544下载。根据微软的说法,完整的.NET框架是“Client”版的超集,所以我想.NET Framework 4.0也不成问题。

手动安装(推荐):
下载压缩包,解压到任意目录,以管理员身份运行附件中的“命令行”,切换到文件所在的目录,运行“install”。卸载的过程是类似的,只是要运行“uninstall”。
如果要在64位IE中使用,运行“install 64"和"uninstall 64”。
“CustomDrag.exe”这个程序可以对拖拽进行一些设置,还可以将自身添加到IE的工具菜单中。这些设置在卸载时都会被删除。

自动安装:
使用MSI文件可以自动安装,但是只有针对32位IE的安装文件。这时需要使用控制面板卸载。

2. 设置搜索字串:
用你喜欢的搜索引擎搜索“{0}”,然后把地址栏中的内容复制下来即可。

3. 参考文献:
http://www.cnblogs.com/TianFang/archive/2011/03/12/1982100.html
http://www.codeproject.com/KB/cs/Issuewithbandobjects.aspx
MSDN.
以及其他。

发布页:
http://code.google.com/p/cs-drag4ie9/

文件下载:
http://code.google.com/p/cs-drag4ie9/downloads/list

Tuesday, May 03, 2011

BHO事件的设置时机

每次导航设置,网页刷新或重导航需设置。

我想这个思路是不是有些问题。

Thursday, April 28, 2011

For IE9的超级拖拽插件(Super Drag & Go for IE9)

Windows 7和IE9比较普遍了,但是死活没有一个能用的超级拖拽插件。这次看了一个实例,自己编了一个。

(更新:http://scarsty.blogspot.com/2011/05/super-drag-and-go-0922beta-for-ie9.html

参考此网址(猛击进入)以及那个平台上提供的例子,编写了一个具体的实现。核心代码是那位作者的,但是他好像没有写好接口部分,自己胡编了一部分代码。

由于只有Express版用,所以只生成了一个dll文件,安装会麻烦一点。

解压至任意文件夹,用管理权限打开命令提示符,运行“install”就是安装,而“uninstall”就是卸载。里面的命令很简单,打开看看就明白了。

如果希望在64位ie下使用的话,请打开install.cmd文件,将里面的“Framework”改成“Framework64”,卸载也一样。

由于C#我不怎么熟,代码里面很多是瞎编的,不过还好居然能用。

现在还有一些bug,哪位熟悉这个的可以指点指点。

http://code.google.com/p/cs-drag4ie9/downloads/list

Wednesday, April 27, 2011

Word中让表格不会被分页的设置

1. 文档的整体设置,高级-兼容性选项,如下图:

image

2. 表格自身的文字环绕须为“环绕”。

image

总之莫名其妙。

Monday, April 18, 2011

CHM文件中的Flash元素要求管理员权限之解决

一般只出现在64位系统,看CHM的时候忽然用户账户控制的对话框冒出来,说关于Flash插件有问题。原因是CHM的排版需要调用IE,而在64位系统中居然是调用64位IE,而Flash是没有针对64位IE的。

解决方案:实际上Flash的64位插件还是有一个测试版,自己到Adobe的网站找吧。

 

as here

http://kb2.adobe.com/cps/000/6b3af6c9.html

Friday, April 15, 2011

IE9下用超级拖拽

IESuper可以糊弄着用。

如果安装并配置之后,再打开IE时首页还是出现配置页面的话,就用管理员权限运行一次IE,设置完就可以了。

Thursday, March 31, 2011

Android工程的组织结构

本文介绍一个十分简单的Android工程的组织,由java语言编写。

这个例子是为了说明如何在没有任何Android开发基础的前提下强行开始工程的研发,适合于有一定其他类的较大项目开发经验,但基本首次接触Android的研发人员。

 

以下为这个Android工程的组织结构,其中比较重要的地方都已经展开了。

clip_image001

src目录下的test1.java为主要源程序,如果工程比较复杂也可以有多个源程序文件。gen目录下的R.java为一个自动生成的java代码文件,主要用来标记界面上各个元素的情况,一般来说开发者不需要修改这个文件。

res\layout目录下的main.xml为主界面,res\values目录下的strings.xml保存了一些字串常量,一般情况下无需修改名字,也可以在主要源程序代码中指定。

在res目录下还保存了程序的图标,图片资源等,管理起来都比较简单,本例中也不讨论这些地方。

 

下面是这个简单例子的界面,比较随意,只为说明问题。

左面为控件库,可以直接用来拖动设计界面,如需要复杂的排版效果,可以直接编辑xml文件。该文件中同时保存了每个控件的id名。例如这里的第一个按钮的对应部分为:

<Button

    android:text="Button123"

    android:id="@+id/button1"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center_horizontal" >

    </Button>

 

本例包含几个基本的控件,即一个字串,两个按钮,一个单行文本编辑框。一般的说,如果觉得这些控件不够美观可以自己画图,再为图片编写事件,大部分情况可以糊弄着用。

image

 

以下为源码文件的内容,注释中将详细说明哪些是非常重要的,哪些是必须手动添加的。

 

package com.test1; 

// 指定的程序名称,在创建工程时由开发者填写

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

// 显示专用库

import android.view.View.OnClickListener;

// 处理点击事件的专用库

import android.widget.Button;

// 按钮专用库

import android.widget.TextView;

// 字串label的专用库

import android.widget.EditText;

// 编辑框的专用库

// 在添加控件时,以上代码并不会被自动加入,需要手动添加

// import相当于C#usingDelphiuses

 

public class test1 extends Activity {

    // 与文件名相同的类

 

    private Button mBtn1, mBtn2;

    private TextView mText;

    private EditText e3; 

    // 定义具体的对象,与主界面中对应,对象名任意起即可

    /** Called when the activity is first created. **/

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        // 以上两行均为自动生成,可以理解为程序入口,通常不要修改

        // (关于程序入口的定位Google的解析非常糊涂,初学者基本看不懂,可以就当是这里)

        setContentView(R.layout.main);

        // 选择一个xml的定义作为主要界面,即指定main.xml

        mBtn1 = (Button) findViewById(R.id.button1);

        mText = (TextView) findViewById(R.id.Text1);

        mBtn2 = (Button) findViewById(R.id.button2);

        e3 = (EditText) findViewById(R.id.editText1);

        // 需手动用findViewById将控件与具体对象关联

 

        mBtn1.setOnClickListener(new OnClickListener() {

            // 为第一个按钮的点击设置监听

            public void onClick(View v)

            // 本行可认为是固定写法

            {

                mBtn2.setText(e3.getText());

            };

            // 具体的内容可以直接写在这部分

        });

        mBtn2.setOnClickListener(new View.OnClickListener() {

            // View.OnClickListener与不写View是一样的,但是输入View.

            // 之后可在弹出的列表中直接选择OnClickListener

            // 下面一行也会自动生成

            public void onClick(View v) {

                // TODO Auto-generated method stub

                onTTTT();

                // 具体的内容也可以写在后面单独的函数

            }

        });

        // 以上内容需在OnCreate过程中写完

 

    }

 

    public void onTTTT() {

        mBtn2.setText(mText.getText());

 

    }

 

}

Friday, February 25, 2011

Chrome插件

鉴于Firefox基本可以干死Mac系统,Safari使用体验上几乎半残,Opera排版胡乱用字体,IE for Mac被微软毙了,目前Mac下面比较好用的浏览器应该是Chrome。这东西如果不加几个插件跟Safari也没啥区别。

一般的说,我只用鼠标手势和超级拖拽,还是习惯的力量。

下载

AdBlock

据说作者现在辞了工作专心开发这个插件,可以理解为对网络时代商业强权的对抗。有空可以给作者捐点钱。

下载 (1)

Drag and Go

超级拖拽目前这个比较好。

下载 (2)

Smooth Gestures

鼠标手势,其实我只用关闭网页的手势。

下载 (3)

Sexy Undo Close Tab

同类品很多,这个包含搜索功能,同时比较美观。

Logo

UndoIt!

当只需要恢复最近关闭的一个标签时,比上面的省去一次点击和精力。

Logo

Force Microsoft Yahei Font

强制雅黑或文泉驿微米黑。Windows下面有用,Mac下就不必了。

Sunday, February 20, 2011

关于《红楼梦》作者的一种观点

《红楼梦》在写什么呢?《红楼梦》在写一个小男孩的成长,他看穿了社会的黑暗,一个成年男人“体制化”的结果就是变成“国贼禄蠹”、“穿靴戴帽的强盗”;这个社会贫富悬殊,司法不公,道义无存,统治阶级为富不仁骄横跋扈,普罗大众饥寒交迫猪狗不如;他看穿了大家庭温情脉脉面纱下的虚伪和凶残,“花柳繁华地温柔富贵乡”不过是男盗女娼的乐园、相互倾轧的屠场。


这个假人、假事、假话构筑的荒唐国家毁灭一切真善美(以大观园里的少女们为代表和象征),也毁灭了这个男孩的爱情,他最终只能远远逃离这个令人绝望的世界。这个男孩的出走,完全否定了中国一切“盛世”的神话,全面揭示了中国令人绝望的荒原般的人文生态环境。


《红楼梦》没有指出一条令人感到希望的道路,但它极具真实性的描写却能解构这个荒唐国家的实质:极权暴政是一切假丑恶的根源。薛蟠、王熙凤和贾赦等人倚仗权势,可以将司法机关玩弄于股掌之间;贾雨村这个落魄的文人依靠谎言攀附权贵,可以青云直上大红大紫;讲真话办真事的甄应嘉就会被抄家下狱;迂腐不知变通的贾政在如此流氓的体制内只能当一个被小人裹挟的糊涂虫和可怜虫。

以上文字出自http://daofeichang.blog.163.com/,写得非常精彩。

该博客的主人认为《红楼梦》的作者是曹頫,120回全部为其所撰。

我不想掺和这个问题,不过我觉得120回出自一个人的可能性比较大。后40回的事也许是作者心态变化,也许有人修订。

而且我还觉得,后40回情节发展迅速,排除那些作者的故弄玄虚,实在比前面要好看一些。

Thursday, February 03, 2011

MSN中的内容转到Wordpress

鉴于微软要关闭live space了,这里的东西虽说看的人不多但是也不能扔掉,于是折腾了半天将内容转至Wordpess。

其中犯了一个错误就是将内容转至新浪了,本是为了在内地访问方便,后来发现新浪这个东西居然不是开放的,想把东西弄出去比较困难。不过办法还是有,就是先用blogbus搬家,再用http://blogbus-to-wordpress.appspot.com/把blogbus导出的格式转换一下。

目前不好说微软会在3月之后把图片都干掉,先这么放着吧。

这个里面还把以前写引擎时的另一个blog的内容弄进来了,看起来有点意思。