by ノッチ » 2006年4月16日(日) 23:38
> その前に、二回目に頂いたコードですが、これで正常に動作するか試して頂けますか?
>
> 環境:XP Home SP 2
> AB Ver4.24.00
>
DLLのコード [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]#include "dll.idx"
>
> '-------------------------------------------------------------------
> ' メモ - このファイルには、DLLの構成要素を記述します。
> ' (例:関数定義、グローバル変数、定数定義など)
> '
> ' エクスポートが必要な関数には、"Export" 修飾子を指定します。
> ' (例:Function Export FuncName() As Long)
> '-------------------------------------------------------------------
>
> '下のNUM_SUBCLASS_WNDを変更すると同時にサブクラス化できるウィンドウ数を変更できる
> Const SUBCLASS_SET=1234567890 As WPARAM
> Const SUBCLASS_UNSET=987654321 As WPARAM
> Dim hInst As HINSTANCE
> Dim hTarget As HWND
> Dim hHook As HANDLE
> Dim pProc As VoidPtr
> Dim bFlag As BOOL
>
>
> Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA"(idHook As Long,lpfn As VoidPtr,hMod As HINSTANCE,dwThreadId As DWord) As HANDLE
> Declare Function CallNextHookEx Lib "user32"(hhk As HANDLE,nCode As Long,wParam As WPARAM,lParam As LPARAM) As LRESULT
> Declare Function UnhookWindowsHookEx Lib "user32"(hhk As HANDLE) As BOOL
> Declare Function ReplyMessage Lib "user32"(lResult As LRESULT) As BOOL
> Const WH_CALLWNDPROC=4
> Const HC_ACTION =0
> Type CWPSTRUCT
> lParam As LPARAM
> wParam As WPARAM
> message As DWord
> hWnd As HWND
> End Type
> Const Static1=1000
> Const Static2=1001
> Const Static3=1002
> Const Static4=1003
> Const Static5=1004
>
> Function Export DllMain(hinstDLL As HINSTANCE, fdwReason As DWord, lpvReserved As VoidPtr) As Long
> 'DLLエントリポイント
> Select Case fdwReason
> Case DLL_PROCESS_ATTACH
> 'DLLがプロセス空間にロードされた時に実行されます。
> _System_StartupProgram()
> hInst=hinstDLL
> hTarget=0
> DllMain=1
> End Select
> End Function
>
> Function Export SetSubClass(hWnd As HWND) As Long
> SetSubClass=0
> If hTarget Then Exit Function
> bFlag=0
> hTarget=hWnd
> Dim ThreadID As DWord
> ThreadID=GetWindowThreadProcessId(hTarget,NULL)
> hHook=SetWindowsHookEx(WH_CALLWNDPROC,AddressOf(CallWndProc),hInst,ThreadID)
> If hHook=0 Then Exit Function
> pProc=SendMessage(hTarget,WM_NULL,SUBCLASS_SET,AddressOf(SubClassProc) As LPARAM) As VoidPtr
> SetSubClass=1
> 'msgbox 0,Str$(AddressOf(SubClassProc) As Double),"SubClassProc"
> 'msgbox 0,Str$(pProc As Long)
> GetWindowLong(hTarget,GWL_WNDPROC)
> msgbox 0,Str$(GetLastError()),"GetLastError"
> End Function
>
> Function Export EndSubClass() As Long
> EndSubClass=0
> If hTarget=0 Then Exit Function
> bFlag=0
> SendMessage(hTarget,WM_NULL,SUBCLASS_UNSET,pProc As Long)
> hTarget=0
> UnhookWindowsHookEx(hHook)
> EndSubClass=1
> End Function
>
> Function CallWndProc(code As DWord,wParam As DWord,lParam As *CWPSTRUCT) As DWord
> If code=HC_ACTION Then
> If bFlag=0 Then
> If lParam->message=WM_NULL Then
> If lParam->wParam=SUBCLASS_SET Then
> bFlag=1
> pProc=SetWindowLong(lParam->hWnd,GWL_WNDPROC,lParam->lParam) As VoidPtr
> msgbox 0,Str$(GetWindowLong(hTarget,GWL_WNDPROC)),"GetWindowLong"
> msgbox 0,Str$(pProc As Double),"戻り値(元のアドレス)"
> msgbox 0,Str$(lParam->lParam),"設定したアドレス"
> ReplyMessage(pProc As LRESULT)
> End If
> End If
> End If
> End If
> CallWndProc=CallNextHookEx(pProc,code,wParam,lParam As LPARAM)
> End Function
>
> Function SubClassProc(hWnd As HWND,message As DWord,wParam As WPARAM,lParam As LPARAM) As LRESULT
> Select Case message
> Case WM_CTLCOLORSTATIC
> SubClassProc=CallWindowProc(pProc,hWnd,message,wParam,lParam)
> 'ここに色変更の処理を追加
> Select Case GetWindowLong(lParam As HWND,GWL_ID)
> Case Static1'これはID
> SetTextColor(wParam As HDC,&H000000FF)
> 'SubClassProcにブラシハンドルを指定すると背景色も変更できます
> Case Static2
> SetTextColor(wParam As HDC,&H0000FF00)
> Case Static3
> SetTextColor(wParam As HDC,&H00FF0000)
> Case Static4
> SetTextColor(wParam As HDC,&H0000FFFF)
> Case Static5
> SetTextColor(wParam As HDC,&H00FFFF00)
> End Select
> 'こんな感じで
> Exit Function
> Case WM_NULL
> If wParam=SUBCLASS_UNSET Then
> SetWindowLong(hWnd,GWL_WNDPROC,pProc As Long)
> Exit Function
> End If
> Case WM_DESTROY
> EndSubClass()
> End Select
> SubClassProc=CallWindowProc(pProc,hWnd,message,wParam,lParam)
> End Function
こちらの環境では
GetWindowLongの戻り値が0、
GetLastErrorの戻り値が5、
とはなりましたが、正常にサブクラス化されて文字色が変更されました。
AB 4.24.00 WindowsXP Home SP2
で、メールはなくてOKです。
http://www.filebank.co.jp/guest/myanoh/
こちらにアクセスしてファイルをダウンロードして下さい。
ゲストフォルダログインという画面になるので
ファイルバンクID:myanoh
フォルダ名:absubclass
パスワード:1234
でゲストフォルダにログインできます。
開いた画面で、環境設定をクリックしてブラウザモードに変更したら
ダウンロードでファイルを落とすことができます。
dll.zipの中に
Dllフォルダ:DLLのプロジェクト
testフォルダ:DLLのSetSubClassを呼び出すプロジェクト
コピー ~ testフォルダ:サブクラス用にStaticを配置したプロジェクト
がありますので、まず「コピー ~ test」内のtest.exeを実行して
「test」プロジェクトでデバッグ実行なりコンパイルして実行をして下さい。
こちらの環境では正常動作するので、これでもエラーになるようですと
PCの違いによる問題かもしれません。(ないとは思いますが)
> その前に、二回目に頂いたコードですが、これで正常に動作するか試して頂けますか?
>
> 環境:XP Home SP 2
> AB Ver4.24.00
> [hide=DLLのコード]#include "dll.idx"
>
> '-------------------------------------------------------------------
> ' メモ - このファイルには、DLLの構成要素を記述します。
> ' (例:関数定義、グローバル変数、定数定義など)
> '
> ' エクスポートが必要な関数には、"Export" 修飾子を指定します。
> ' (例:Function Export FuncName() As Long)
> '-------------------------------------------------------------------
>
> '下のNUM_SUBCLASS_WNDを変更すると同時にサブクラス化できるウィンドウ数を変更できる
> Const SUBCLASS_SET=1234567890 As WPARAM
> Const SUBCLASS_UNSET=987654321 As WPARAM
> Dim hInst As HINSTANCE
> Dim hTarget As HWND
> Dim hHook As HANDLE
> Dim pProc As VoidPtr
> Dim bFlag As BOOL
>
>
> Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA"(idHook As Long,lpfn As VoidPtr,hMod As HINSTANCE,dwThreadId As DWord) As HANDLE
> Declare Function CallNextHookEx Lib "user32"(hhk As HANDLE,nCode As Long,wParam As WPARAM,lParam As LPARAM) As LRESULT
> Declare Function UnhookWindowsHookEx Lib "user32"(hhk As HANDLE) As BOOL
> Declare Function ReplyMessage Lib "user32"(lResult As LRESULT) As BOOL
> Const WH_CALLWNDPROC=4
> Const HC_ACTION =0
> Type CWPSTRUCT
> lParam As LPARAM
> wParam As WPARAM
> message As DWord
> hWnd As HWND
> End Type
> Const Static1=1000
> Const Static2=1001
> Const Static3=1002
> Const Static4=1003
> Const Static5=1004
>
> Function Export DllMain(hinstDLL As HINSTANCE, fdwReason As DWord, lpvReserved As VoidPtr) As Long
> 'DLLエントリポイント
> Select Case fdwReason
> Case DLL_PROCESS_ATTACH
> 'DLLがプロセス空間にロードされた時に実行されます。
> _System_StartupProgram()
> hInst=hinstDLL
> hTarget=0
> DllMain=1
> End Select
> End Function
>
> Function Export SetSubClass(hWnd As HWND) As Long
> SetSubClass=0
> If hTarget Then Exit Function
> bFlag=0
> hTarget=hWnd
> Dim ThreadID As DWord
> ThreadID=GetWindowThreadProcessId(hTarget,NULL)
> hHook=SetWindowsHookEx(WH_CALLWNDPROC,AddressOf(CallWndProc),hInst,ThreadID)
> If hHook=0 Then Exit Function
> pProc=SendMessage(hTarget,WM_NULL,SUBCLASS_SET,AddressOf(SubClassProc) As LPARAM) As VoidPtr
> SetSubClass=1
> 'msgbox 0,Str$(AddressOf(SubClassProc) As Double),"SubClassProc"
> 'msgbox 0,Str$(pProc As Long)
> GetWindowLong(hTarget,GWL_WNDPROC)
> msgbox 0,Str$(GetLastError()),"GetLastError"
> End Function
>
> Function Export EndSubClass() As Long
> EndSubClass=0
> If hTarget=0 Then Exit Function
> bFlag=0
> SendMessage(hTarget,WM_NULL,SUBCLASS_UNSET,pProc As Long)
> hTarget=0
> UnhookWindowsHookEx(hHook)
> EndSubClass=1
> End Function
>
> Function CallWndProc(code As DWord,wParam As DWord,lParam As *CWPSTRUCT) As DWord
> If code=HC_ACTION Then
> If bFlag=0 Then
> If lParam->message=WM_NULL Then
> If lParam->wParam=SUBCLASS_SET Then
> bFlag=1
> pProc=SetWindowLong(lParam->hWnd,GWL_WNDPROC,lParam->lParam) As VoidPtr
> msgbox 0,Str$(GetWindowLong(hTarget,GWL_WNDPROC)),"GetWindowLong"
> msgbox 0,Str$(pProc As Double),"戻り値(元のアドレス)"
> msgbox 0,Str$(lParam->lParam),"設定したアドレス"
> ReplyMessage(pProc As LRESULT)
> End If
> End If
> End If
> End If
> CallWndProc=CallNextHookEx(pProc,code,wParam,lParam As LPARAM)
> End Function
>
> Function SubClassProc(hWnd As HWND,message As DWord,wParam As WPARAM,lParam As LPARAM) As LRESULT
> Select Case message
> Case WM_CTLCOLORSTATIC
> SubClassProc=CallWindowProc(pProc,hWnd,message,wParam,lParam)
> 'ここに色変更の処理を追加
> Select Case GetWindowLong(lParam As HWND,GWL_ID)
> Case Static1'これはID
> SetTextColor(wParam As HDC,&H000000FF)
> 'SubClassProcにブラシハンドルを指定すると背景色も変更できます
> Case Static2
> SetTextColor(wParam As HDC,&H0000FF00)
> Case Static3
> SetTextColor(wParam As HDC,&H00FF0000)
> Case Static4
> SetTextColor(wParam As HDC,&H0000FFFF)
> Case Static5
> SetTextColor(wParam As HDC,&H00FFFF00)
> End Select
> 'こんな感じで
> Exit Function
> Case WM_NULL
> If wParam=SUBCLASS_UNSET Then
> SetWindowLong(hWnd,GWL_WNDPROC,pProc As Long)
> Exit Function
> End If
> Case WM_DESTROY
> EndSubClass()
> End Select
> SubClassProc=CallWindowProc(pProc,hWnd,message,wParam,lParam)
> End Function[/hide]
こちらの環境では
GetWindowLongの戻り値が0、
GetLastErrorの戻り値が5、
とはなりましたが、正常にサブクラス化されて文字色が変更されました。
AB 4.24.00 WindowsXP Home SP2
で、メールはなくてOKです。
[url]http://www.filebank.co.jp/guest/myanoh/[/url]
こちらにアクセスしてファイルをダウンロードして下さい。
ゲストフォルダログインという画面になるので
ファイルバンクID:myanoh
フォルダ名:absubclass
パスワード:1234
でゲストフォルダにログインできます。
開いた画面で、環境設定をクリックしてブラウザモードに変更したら
ダウンロードでファイルを落とすことができます。
dll.zipの中に
Dllフォルダ:DLLのプロジェクト
testフォルダ:DLLのSetSubClassを呼び出すプロジェクト
コピー ~ testフォルダ:サブクラス用にStaticを配置したプロジェクト
がありますので、まず「コピー ~ test」内のtest.exeを実行して
「test」プロジェクトでデバッグ実行なりコンパイルして実行をして下さい。
こちらの環境では正常動作するので、これでもエラーになるようですと
PCの違いによる問題かもしれません。(ないとは思いますが)