トップ «前の日記(2002-12-06(Fri)) 最新 次の日記(2002-12-10(Tue))» 編集

K2さんの雑記


2002-12-07(Sat) [長年日記]

[TTBase]AlwaysK2Eプラグイン

 プラグイン中毒にかかっていますので(^^; また一本作ってしまいました。

 いや、実は、今日、別のことをやろうとして、エクスプローラからK2Editorに関連付けられていないファイルをK2Editorで開こうとして、ふっと閃いてしまいました。

 そういやー、昔(Win95の頃)は、WZEditor 3.0を入れると、エクスプローラ上でSHIFT+ENTERを押すと、強制的にWZEditorで開いてくれたよなぁ。あれ便利だったなぁ。

 あれ確か、レジストリの関連づけの裏技みたいなの使ってたんだよなぁ。Windows98あたりから、その裏技が使えなくなって、この機能が消滅してしまったんだよなぁ。

 ん、そういえば、常駐もんでこの機能を実現できるんじゃないの? エクスプローラ上でSHIFT+ENTERを監視して、そのイベントをエクスプローラから横取りして、K2Editorにファイルを送っちゃえばいいやん。

 大枠は割と簡単にできた。で、いざエクスプローラで選択されているファイル名を取得しようとして、はたと行き詰まってしまった。ファイル名はリストビューから取ればよいんだろう。じゃぁフォルダ名はどうするの。アドレスバーにあるじゃない。んー、でもフォルダオプション変更すると、ここフルパスじゃなくなってしまうんだよなぁ。

 それからWEBで検索をしてみたが、あんまりいい情報がない。DelphiMLで、どなたかが、「ShellWindowsとInternetExplorerを使えばいけるのではないか」というアイデアを書いていらっしゃるのを見つけたが、具体的なコードはない。ShellWindowsで調べても、あんまり情報がないのだよなぁ。で、もう一度DelphiのVCLに戻って、ShellWindowsを調べると、TShellWindowsというのがあった。どうやら、エクスプローラとインターネットエクスプローラを列挙してくれるActiveX系のオブジェクトのようだ。使い方が全くわからん。検索しても、Delphi関連のページでは情報がほとんどない。適当にやってみたら、なんとかできてしまった。

SW := TShellWindows.Create(nil);
Count := WS.Count;
for I := 0 to Count - 1 do
(SW.Item(I) as InternetExplorer).LocationURL

これで、フォルダ名のフルパス(実際にはURL形式だから加工が必要だが)が取れる。で、そのまま完成型まで持っていったが、このプラグインをエクスプローラで使用すると、エクスプローラを終了するときに、エクスプローラが結構致命的なエラーを吐くことがわかった。

 昔、フックとDelphi製のDLLで同じようなエラーを出してかなり長時間はまったことがあったので、今回もそれかと想像。フック部分はVCで書いていたのだが、慣れの問題で、Delphiで書いた方が開発速度が一桁くらい上がるのよねぇ。で、ActiveX系のややこしいところはDelphiで書こうとしていたんだが、全部VC++に移植しないとあかんかなぁと。まぁ、とりあえず調査調査で、結局、先ほどのコードが原因だったことが判明した。

 実際には、

var
SW: IShellWindows;
SW := CoShellWindows.Create;
for I := 0 to SW.Count - 1 do
begin
(SW.Item(I) as InternetExplorer).LocationURL;

と書く必要がありました。うーん、この辺に関しては絶対的な知識不足だー。こんなコードをすらすら書けるようになるのか。やはりCOM関連は一度ちゃんと勉強しないといけない。でも、関連ドキュメントが少なすぎるよー。

 さて、もう一つ問題は、エクスプローラのリストビューから、ファイル名を取得する部分。これが結構ややこしくて、そう簡単にはファイル名を教えてくれない。共有メモリをちゃんと作成しないといけないし、一見使えそうなListView_GetItemTextは使えないことが判明。この辺はCで書いた方が楽らしい。Cなら上記マクロはちゃんと動くようだ。

 で、最初は楽勝楽勝と思っていたが、最終的にかなり大変な作業になってしまった。

 しかし、懐かしのSHIFT+ENTERでテキストエディタ強制起動というのは、やっぱりかなり便利。まぁ、こんなのを便利だと言える人は、やっぱりかなり普通の人ではないのかもしれないけど。 うちのベータページに置いてあります。興味のある方はどうぞ。


1965|09|
2002|09|10|11|12|
2003|01|02|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|03|04|05|08|
2014|01|02|03|04|05|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|11|
2017|01|03|05|06|07|08|10|11|12|
2018|01|02|03|04|05|08|09|10|12|
2020|01|07|




2002年
12月
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 27 28
29 30 31
//
自己紹介
自己紹介
広告
計るだけダイエット
今聴いてるの
ブルックナー:交響曲第7番 ブルックナー:交響曲第7番
ブルックナー:交響曲第8番 ブルックナー:交響曲第8番
読書中
つっこみリスト
TrackBacks
日記仲間
/ / /
最近の日記