#include "hscallbk.as"
#uselib "user32.dll"
#cfunc CallWindowProc "CallWindowProcA" sptr,sptr,sptr,sptr,sptr
#cfunc GetWindowLong "GetWindowLongA" sptr,sptr
#func SetWindowLong "SetWindowLongA" sptr,sptr,sptr
#define GWL_WNDPROC 0xFFFFFFFC
#define WM_RBUTTONDOWN 0x00000204
#uselib ""
#func _NewButtonProc "" int, int, int, int
setcallbk NewButtonProc, _NewButtonProc, *OnNewButtonProc
screen 0, 640, 480
button gosub "button", *click
hButton = objinfo_hwnd(stat)
pfnDefButtonProc = GetWindowLong(hButton, GWL_WNDPROC)
SetWindowLong hButton, GWL_WNDPROC, varptr(NewButtonProc)
stop
*OnNewButtonProc
_hwnd = callbkarg(0)
uMsg = callbkarg(1)
_wparam = callbkarg(2)
_lparam = callbkarg(3)
if uMsg == WM_RBUTTONDOWN {
gosub *rclick
return 0
}
return CallWindowProc(pfnDefButtonProc, _hwnd, uMsg, _wparam, _lparam)
*click
dialog "click"
return
*rclick
dialog "rclick"
return
参考:
http://eternalwindows.jp/control/controlbase/controlbase05.html
一応できたのですが、いくつか質問があります。
まず、GetWindowLongPtrを呼び出すと失敗します。msdnでは32,64ビットどちらも使えるような
記述があるのですが、こちら
http://hwada.hatenablog.com/entry/20071016/1192519595
では、32ビットではGetWindowLongのエイリアスとなると書いてあるので、結局VC++のヘッダで
マクロ定義されているだけだということでしょうか。
あと、ここではWM_RBUTTONDOWNでreturn 0を行っていますが、デフォルトの挙動を行わせるために、
そのままCallWindowProcを呼び出した方がいいのでしょうか。
よろしくお願いします。