| 月 | 火 | 水 | 木 | 金 | 土 | 日 | 
|---|---|---|---|---|---|---|
| 29 | 30 | 31 | 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 | 1 | 2 | 
・・・あれ?過去にっき検索しんたんだけど、16巻を買ってる記録が無い。 買い逃してるんだろーか。。。 部屋の本棚にも15巻までしか並んでないし。
2001/06/05にも書いてるんだけど、やっぱり絵が下手になってる気がする。 しかも、一箇所だけじゃなく全編通してず〜っと。 画風が変わったとかゆーんじゃなく、デッサンがむちゃくちゃになってるんだよね。
どーしたんだろ、ホントに。
IDEのキーボードイベントやらマウスイベントやらって通知する方法がないのね(T-T) なんとか回避手段はないものだろーか。
って書いて以来、実際の検索機能はほっぽってこの件についていろいろ試してみている。
最初は
アドインってActiveX DLLでしょ?(たぶん) ってことは同じプロセス内で動くんだよね(あやふや) ってことはローカルフックのフックプロシージャ書いても大丈夫だよね(自信ゼロ)
なんて、妄想200%な考えを基にローカルフックの手法で試してたんだけど、やり方がまずいのか前提がまずいのか *1、 うまくいかず玉砕。
仕方がないんで、VCでDLL作って*2フックプロシージャ置いてシステムフックするよーにしてみたんだけど。 今度は、ちゃんとフックされてキーイベントが発生♪ま、とーぜんといえばとーぜんなんだろーけど、ちょっと感動。
・・・したのもつかの間、VBIDE.VBEなオブジェクトに対していろいろやろうとしたらオートメーションエラーが出てしまった。 このオブジェクトたちに触らなければいいんだけど、それじゃあんまり意味無いしねぇ。 惜しいところまでは来てるんだけど、これ以上は私ではどーしようもないっぽい。
誰か解決手段おせーて(懇願)
システムフック時のフックプロシージャ内でSendMessageするのってやっぱり危険なのかなぁ。。。 今作ってるシステムフック用DLLがこんな感じのソースなんだけど。 上にも書いたオートメーションエラーの問題ってこのDLL側に原因があるのかな〜なんて思ってみちゃったりしてるのだ。
// MomoHook.cpp
#include <windows.h>
#include "MomoHook.h"
#pragma data_seg(".MomoHook")
  HHOOK m_hHook = NULL;
  HWND  m_hWnd  = NULL;
  UINT  m_msg   = NULL;
#pragma data_seg()
static HINSTANCE m_hInst = NULL;
int WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, PVOID pvReserved)
{
  m_hInst = hInst;
  return TRUE;
}
BOOL CALLBACK MomoSetWindowsHook(HWND hwnd, UINT msg, int idHook, DWORD dwThreadId)
{
  //すでにフックされてれば失敗
  if(m_hHook != NULL)
    return FALSE;
  //ハンドルを登録
  m_hWnd = hwnd;
  m_msg = msg;
  //フック開始
  m_hHook = ::SetWindowsHookEx(idHook, (HOOKPROC)CallWndProc, m_hInst, dwThreadId);
  //フックハンドルが取得できていなければ失敗
  if(!m_hHook)
    return FALSE;
  return TRUE;
}
BOOL CALLBACK MomoUnhookWindowsHook(void)
{
  BOOL rtn = FALSE;
  if(m_hHook != NULL){
    rtn = ::UnhookWindowsHookEx(m_hHook);
    m_hHook = NULL;
  }
  return rtn;
}
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  if(nCode < 0)
    return ::CallNextHookEx(m_hHook, nCode, wParam, lParam);
  return ::SendMessage(m_hWnd, m_msg, wParam, lParam);
}
*1: フックされてなかったっぽいんで、前提がまずかったんだろーな。
*2: 初体験♪
    このページにリンクを張りたい人はご自由にどうぞ。
    疑問・感想・要望・不満・文句・愚痴等々ありましたら↓までメール下さいましm(_ _)m