HOME  >  2013/09

サイト上のソースコードを見やすくするには つづき

昨日のつづきで、SyntaxHighlighter を使ってみます。

すばらしいことに、SyntaxHighlighter で Solarized 配色を実現している方がいました!
Syntaxhighlighter にも Solarized を!(あと Gist も) | blog.remora.cx

ためしにローカルで使ってみた結果がこれ↓ すごくいい(とりあえず出力された HTML 貼り付けただけ)
ウィンドウハンドル _hwnd へ WM_APP の送信を許可する例(一部)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/* 関数ポインタ型宣言 */
typedef BOOL (__stdcall *FUNCTYPEVISTA)(UINT, DWORD);
typedef BOOL (__stdcall *FUNCTYPE7)(HWND, UINT, DWORD, int);
 
(中略)
 
FUNCTYPE7 ChangeWindowMessageFilterEx;
FUNCTYPEVISTA ChangeWindowMessageFilter;
 
HMODULE dll = LoadLibrary(TEXT("user32.dll"));
 
ChangeWindowMessageFilterEx =
    (FUNCTYPE7)GetProcAddress(dll, "ChangeWindowMessageFilterEx");
 
if(ChangeWindowMessageFilterEx != NULL){
    /* 7 以降ならこれを使う(7 以降なら実装されている API) */
    ChangeWindowMessageFilterEx(_hWnd, WM_APP, MSGFLT_ALLOW, 0);
}else{
    ChangeWindowMessageFilter =
        (FUNCTYPEVISTA)GetProcAddress(dll, "ChangeWindowMessageFilter");
    if(ChangeWindowMessageFilter != NULL){
        /* Vista ならこれを使う(Vista 以降なら実装されている API) */
        ChangeWindowMessageFilter(WM_APP, MSGFLT_ADD);
    }
}
FreeLibrary(dll);
SyntaxHighlighter は言語ごとに専用の javascript を呼び出す必要があるので
多言語を扱ってると面倒だなと思ったけど、
そのページで使用している言語に対応する javascript を自動で呼び出してくれる autoloader もありました。
本格的に導入しちゃおうかなあ。
スポンサーサイト



2013/09/30 | カテゴリ:UI | トラックバック(0) | コメント(0)

サイト上のソースコードを見やすくするには

やっぱり SyntaxHighlighter を使うのが主流なのかな。
現状このブログでは、 Emacs の htmlize で出力した HTML を貼っ付けています。

htmlize

htmlize は、Emacs で表示されている配色でバッファを HTML 出力してくれるものです。
Emacs、ブログの両方で同じ配色(カラースキーム Solarized) を利用しているので
そんなに見た目はおかしくならんべ(楽できるし)と思って使っています。
EmacsWiki: Htmlize

SyntaxHighlighter

htmlize と比較すると、行番号を付加したり、特定の行をハイライトしたりできるので
ソースの解説しやすいという利点あり。
あえて欠点をあげるとしたら javascript を使用することになるとか、
ソースの表示箇所で table タグが使用されることになるのが不思議とかそのくらい。

SyntaxHighlighter の配色を設定するのが面倒で使ってなかったけど、使ってみようかな。
考えてみれば、誰かがきっと Solarized 配色の css を作っているだろうし、とりあえず明日探してみよう。
SyntaxHighlighter - Themes
2013/09/29 | カテゴリ:UI | トラックバック(0) | コメント(0)

グローバルフック(システムフック)でハマったところ つづき

先日の続き
XP、Vista、7 とマルチ対応のグローバルフック(システムフック)の実装方法です。
ウィンドウハンドル _hwnd への WM_APP の送信を許可する例です。
C 言語 の DLL を作成しているという前提での記載です。

/* 関数ポインタ型宣言 */
typedef BOOL (__stdcall *FUNCTYPEVISTA)(UINT, DWORD);
typedef BOOL (__stdcall *FUNCTYPE7)(HWND, UINT, DWORD, int);

(中略)

FUNCTYPE7 ChangeWindowMessageFilterEx;
FUNCTYPEVISTA ChangeWindowMessageFilter;

HMODULE dll = LoadLibrary(TEXT("user32.dll"));

ChangeWindowMessageFilterEx =
    (FUNCTYPE7)GetProcAddress(dll, "ChangeWindowMessageFilterEx");

if(ChangeWindowMessageFilterEx != NULL){
    /* 7 以降ならこれを使う(7 以降なら実装されている API) */
    ChangeWindowMessageFilterEx(_hWnd, WM_APP, MSGFLT_ALLOW, 0);
}else{
    ChangeWindowMessageFilter =
        (FUNCTYPEVISTA)GetProcAddress(dll, "ChangeWindowMessageFilter");
    if(ChangeWindowMessageFilter != NULL){
        /* Vista ならこれを使う(Vista 以降なら実装されている API) */
        ChangeWindowMessageFilter(WM_APP, MSGFLT_ADD);
    }
}
FreeLibrary(dll);

後始末は、同様にLoadLibrary、条件分岐して、フィルタの設定を戻してあげれば終わりです。

ChangeWindowMessageFilterEx(_hWnd, WM_APP, MSGFLT_RESET, 0);
ChangeWindowMessageFilter(WM_APP, MSGFLT_REMOVE);

2013/09/28 | カテゴリ:プログラミング | トラックバック(0) | コメント(0)

グローバルフック(システムフック)でハマったところ

Hit a Hint for Windows を作成していて一番ハマったのが
グローバルフック(システムフック)しているのに、ウィンドウメッセージが送られてこない
という現象が発生したことでした。

以下の 2点でハマりました。
  1. 64bit プロセス上からのフックでは、32bit 上プロセスのウィンドウメッセージが取得不可(逆もまた同じ)
  2. Windows Vista 以降の場合、ウィンドウメッセージが一部フィルタリングされる

1. の対処法

64bit 環境の場合は、64bit と 32bit 両方のプロセスからフックしてあげる必要があります。
下記サイトが参考になります。
monoの開発ブログ - 64bit対応なフックを使ったアプリの作り方

2. の対処法

下記 API を使用して、フィルタの設定を変更する必要があります。
Vista : ChangeWindowMessageFilter
7 以降 : ChangeWindowMessageFilterEx
下記が参考になります。
Windows Vista® および Windows Server® 2008 アプリケーション互換性解説書

※ XP、Vista、7 とマルチで使えるアプリケーションを作成したい場合は注意
例えば、XP の場合は上記 API が実装されていないため、単純に呼び出すことができません。
そのため、実行時ロード(LoadLibrary)を使って、ChangeWindowMessageFilter が呼び出せるのであれば呼び、
無ければ呼ばないというように実装する必要があります。

この辺の実装例は、眠いのでまた明日に。
2013/09/27 | カテゴリ:プログラミング | トラックバック(0) | コメント(2)

Hit a Hint for Windows はじめました

Hit-a-Hint の操作感を他でも活かせないかということで、
衝動的、かつ実験的に Hit a Hint for Windows を作成してみました。

Hit-a-Hint の操作感で、以下が可能になります。
・ボタン、タブなどのコントロールのクリック
・タスクトレイアイコンのクリック など

保有している環境が Windows 7 しかないので、
他バージョンでの動作確認ができていませんが、
XP SP3 以降であれば条件付きで動くはずです。

動作環境等の詳細な説明、ダウンロードはこちらから

見た目は、こんな感じです↓
hw_ss.jpg

# この記事書いて見直しているときに思ったけど、
# 上の画面だと、そもそも Hit-a-Hint 不要だよね。。。
# Alt + アルファベットでデフォルトで操作できるし。
# 例として失敗したかも。
# ま、いっか。
2013/09/26 | カテゴリ:ソフトウェア開発 | トラックバック(0) | コメント(0)

Chrome はじめました

ブログを始めるのを機にブラウザを Firefox から Google Chrome に本格的に切り替えてみました。

描画の速さを実感しております。。。が
個人的に多少の不満があったり。

キーバインドフェチ、かつキーボードブラウジングフェチなので、
Hit-a-Hint とキーバインドの設定ができる拡張機能をいろいろと試してみたのですが、
Keysnail + HoK に及ぶものがなかなか見つからないのです。
(見つからないというより、そもそも自分の要求を満たす拡張機能の作成が不可能なのかも。
Google Chrome 自体のもつショートカットキーを無効にしたり、変更ができないみたいだし。)

ぼけーっとしていると、C-n を押していて Google Chrome のウィンドウが増殖すること多数。
ま、慣れなんでしょうけど。

Keyconfig は、すごくおもしろいですし。

emacs じゃなくて vi 式のキーバインドにしちゃえばいいのかな。

それにしても Hit-a-Hint の操作感はおもしろいなあ。
2013/09/25 | カテゴリ:UI | トラックバック(0) | コメント(0)
外部リンク

カンパのお願い
公開しているソフトウェアはフリーウェアなので無料でご利用いただけます。 気に入ってくださった方は、Amazon でお買い物をする際に下記のリンクを経由して頂ければ励みになります。

検索BOX・タグ一覧