テンプレ更新
大して記事書いてもいないのにテンプレ更新するのもあれなんですが表示がおかしくなってたので切り替えました
応用技術者試験の合格発表は12月21日
覚えやすいけど遅すぎる…クリスマス前か…
なんか技術系の記事3つぐらい公開しないまま途中で書き終わってるので
学園祭でこの1週間休みだから書こうかな
そういえば夏休みの間に他大学の彼女がめでたく出来たんだけど平日だから一緒に回れない…
ので多分彼女の大学まで遊びに行きます
あと友達に誘われて社交ダンスサークルに入りました
背が高いと、新体操っぽいのでは不利と散々言われてきましたが
社交ダンスでは逆に背が高いといいらしい
のでがんばります
応用技術者試験の合格発表は12月21日
覚えやすいけど遅すぎる…クリスマス前か…
なんか技術系の記事3つぐらい公開しないまま途中で書き終わってるので
学園祭でこの1週間休みだから書こうかな
そういえば夏休みの間に他大学の彼女がめでたく出来たんだけど平日だから一緒に回れない…
ので多分彼女の大学まで遊びに行きます
あと友達に誘われて社交ダンスサークルに入りました
背が高いと、新体操っぽいのでは不利と散々言われてきましたが
社交ダンスでは逆に背が高いといいらしい
のでがんばります
応用情報処理技術
応用情報処理技術者試験、受けました
勉強時間足りなさ過ぎてもうムリポ
基本情報処理技術者試験
午前 勉強時間 100時間
午後 勉強時間 2時間
応用情報処理技術者試験
午前 勉強時間 10時間
午後 勉強時間 30分(試験日の昼休み)
・・・本来なら応用の方が勉強時間必要なはずなのに受かるわけない
5100円出費してくれた親ごめんなさい・・・夏休み遊んでばかりでごめんなさい・・・
さて、自己採点してみた
午前 64点 合格ライン60点
午後 64点 合格ライン60点
午前は配点率が統一されたから通っただろう
午後は記述のところ空白だらけだからかなり厳しい
もし通ったら万々歳、自惚れずに精進・・・
勉強時間足りなさ過ぎてもうムリポ
基本情報処理技術者試験
午前 勉強時間 100時間
午後 勉強時間 2時間
応用情報処理技術者試験
午前 勉強時間 10時間
午後 勉強時間 30分(試験日の昼休み)
・・・本来なら応用の方が勉強時間必要なはずなのに受かるわけない
5100円出費してくれた親ごめんなさい・・・夏休み遊んでばかりでごめんなさい・・・
さて、自己採点してみた
午前 64点 合格ライン60点
午後 64点 合格ライン60点
午前は配点率が統一されたから通っただろう
午後は記述のところ空白だらけだからかなり厳しい
もし通ったら万々歳、自惚れずに精進・・・
VB.NET:SetWindowLong
どうもご無沙汰してます
まぁアクセスログ眺めるとほとんどがMapleStoryの窓化、多重起動で検索してやってきた人ばかりなので特に新しい記事を読んでもらってるとは思っておりません
さて、記事の内容に一貫性はありませんが今回はVB.NETの話
ふと、思い出したそれは・・さるべーじさんの「VB5:カクカクとリサイズしたい。」というもはや10年以上前の記事
これをVB.NETに移そうとしてもうまくいかなかった3,4年前。
ちょっとVB.NETで開発してた時にそのことを思い出したので再挑戦してみたら、
苦戦しながらもなんとか実装できた。
のでVB.NET用に変換したコードとして貼り付けておきます
面倒くさいので色付けはコメントのみに・・・
'コードの先頭に
Imports System.Runtime.InteropServices
'WindowsAPI関数の宣言
Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
(ByVal hWnd As Integer, ByVal nIndex As Integer, <MarshalAs(UnmanagedType.FunctionPtr)> ByVal dwNewInteger As fncKakuDragDelegate) As Integer
Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
(ByVal hWnd As Integer, ByVal nIndex As Integer, ByVal dwNewInteger As Integer) As Integer
Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Integer, ByVal hWnd As Integer, ByVal MSG As Integer, _
ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
(ByVal Destination As Integer, ByVal Source As Integer, ByVal Length As Integer)
Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
(ByRef Destination As RECT, ByVal Source As Integer, ByVal Length As Integer)
Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
(ByVal Destination As Integer, ByRef Source As RECT, ByVal Length As Integer)
'RECT構造体の宣言
Structure RECT
Dim Left As Integer
Dim Top As Integer
Dim Right As Integer
Dim Bottom As Integer
End Structure
'定数の宣言
Public Const GWL_WNDPROC = (-4)
Public Const WM_SIZING = &H214
'もともとのウィンドウ関数のアドレス
Public OldWp As Integer
'デリゲートの宣言
Delegate Function fncKakuDragDelegate( _
ByVal hWnd As Integer, ByVal uMsg As Integer, _
ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Public Function fncKakuDrag( _
ByVal hWnd As Integer, ByVal uMsg As Integer, _
ByVal wParam As Integer, ByVal lParam As Integer) As Integer
'*** フックしたメッセージの振り分けと対処
Select Case uMsg
Case WM_SIZING
Dim wkRect As RECT
Dim Length As Integer = Marshal.SizeOf(wkRect)
MoveMemory(wkRect, lParam, Length)
wkRect.Right = wkRect.Left + 250
wkRect.Bottom = wkRect.Top + ((wkRect.Bottom - wkRect.Top) \ 50) * 50
MoveMemory(lParam, wkRect, Length)
Case Else
Return CallWindowProc(OldWp, hWnd, uMsg, wParam, lParam)
End Select
Return 0
End Function
'フック開始
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
OldWp = SetWindowLong(Me.Handle.ToInt32, GWL_WNDPROC, AddressOf fncKakuDrag)
End Sub
'フック終了
Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.FormClosed
OldWp = SetWindowLong(Me.Handle.ToInt32, GWL_WNDPROC, OldWp)
End Sub
何がどう変わったのかは大体見比べてくれるとわかるんじゃないかと思います
・VB5でいうLong型はVB.NETでいうInteger型
・構造体の宣言の仕方はVB5と違うので修正
…あんまり細かく書くと結構長いので中略
・LenB関数はVB.NETにはないのでMarshal.SizeOf関数で構造体のバイトのサイズを取得する
・AddressOf演算子で取得する関数のアドレスはVB5では多分Long型だが、VB.NETではデリゲート型なのでDelegateキーワードでデリゲートを定義
○SetWindowLong関数の定義で第3引数をデリゲート型にする。
・MoveMemory関数の定義でなんでもOK?なAny型はVB.NETではできないので型をRECTにする。2つ宣言して片方はInteger、RECT、Integerで片方はRECT、Integer、Integerの引数にする
・RECT構造体を引数に渡す際、ByValキーワードだと値渡しになるので参照渡しのByRefキーワードに書き換える
…エトセトラ!
まぁそんなこんなで一番頭を抱えさせたのは上記の青色の文
最終的には第3引数に<MarshalAs(UnmanagedType.FunctionPtr)>という属性をつけることで解決しますが、この属性がなければCallbackOnCollectedDelegateというエラーが出る
コールバックが、型 なんちゃらかんちゃら のガベージ コレクションされたデリゲートで行われました。これは、アプリケーションのクラッシュ、破損、およびデータの損失を発生させる可能性があります。デリゲートをアンマネージ コードに渡すとき、デリゲートは 2 度と呼び出されないことが確実になるまでマネージ アプリケーションによって維持されなければなりません。
わけわかめ。
マネージってのは・・・まぁ.NET FrameWorkを利用するプログラム
アンマネージってのは従来のネイティブプログラム…ここではWindowsAPI、SetWindowLong関数のこと
SetWindowLongの第3引数にデリゲート型を指定すると、コールバックしてアンマネージコードからマネージコードに帰ってくるときにガベージコレクション…使用メモリの整理が行われるため、関数のアドレスがごっちゃになって?危険だよ…的な感じかな…?
とにかく、アンマネージな引数にしたいので、属性を指定すると、うまく動いた。
参考URL
http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet28/vb6tonet28_03.html
http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet23/vb6tonet23_01.html
まぁアクセスログ眺めるとほとんどがMapleStoryの窓化、多重起動で検索してやってきた人ばかりなので特に新しい記事を読んでもらってるとは思っておりません
さて、記事の内容に一貫性はありませんが今回はVB.NETの話
ふと、思い出したそれは・・さるべーじさんの「VB5:カクカクとリサイズしたい。」というもはや10年以上前の記事
これをVB.NETに移そうとしてもうまくいかなかった3,4年前。
ちょっとVB.NETで開発してた時にそのことを思い出したので再挑戦してみたら、
苦戦しながらもなんとか実装できた。
のでVB.NET用に変換したコードとして貼り付けておきます
面倒くさいので色付けはコメントのみに・・・
'コードの先頭に
Imports System.Runtime.InteropServices
'WindowsAPI関数の宣言
Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
(ByVal hWnd As Integer, ByVal nIndex As Integer, <MarshalAs(UnmanagedType.FunctionPtr)> ByVal dwNewInteger As fncKakuDragDelegate) As Integer
Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
(ByVal hWnd As Integer, ByVal nIndex As Integer, ByVal dwNewInteger As Integer) As Integer
Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Integer, ByVal hWnd As Integer, ByVal MSG As Integer, _
ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
(ByVal Destination As Integer, ByVal Source As Integer, ByVal Length As Integer)
Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
(ByRef Destination As RECT, ByVal Source As Integer, ByVal Length As Integer)
Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
(ByVal Destination As Integer, ByRef Source As RECT, ByVal Length As Integer)
'RECT構造体の宣言
Structure RECT
Dim Left As Integer
Dim Top As Integer
Dim Right As Integer
Dim Bottom As Integer
End Structure
'定数の宣言
Public Const GWL_WNDPROC = (-4)
Public Const WM_SIZING = &H214
'もともとのウィンドウ関数のアドレス
Public OldWp As Integer
'デリゲートの宣言
Delegate Function fncKakuDragDelegate( _
ByVal hWnd As Integer, ByVal uMsg As Integer, _
ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Public Function fncKakuDrag( _
ByVal hWnd As Integer, ByVal uMsg As Integer, _
ByVal wParam As Integer, ByVal lParam As Integer) As Integer
'*** フックしたメッセージの振り分けと対処
Select Case uMsg
Case WM_SIZING
Dim wkRect As RECT
Dim Length As Integer = Marshal.SizeOf(wkRect)
MoveMemory(wkRect, lParam, Length)
wkRect.Right = wkRect.Left + 250
wkRect.Bottom = wkRect.Top + ((wkRect.Bottom - wkRect.Top) \ 50) * 50
MoveMemory(lParam, wkRect, Length)
Case Else
Return CallWindowProc(OldWp, hWnd, uMsg, wParam, lParam)
End Select
Return 0
End Function
'フック開始
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
OldWp = SetWindowLong(Me.Handle.ToInt32, GWL_WNDPROC, AddressOf fncKakuDrag)
End Sub
'フック終了
Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.FormClosed
OldWp = SetWindowLong(Me.Handle.ToInt32, GWL_WNDPROC, OldWp)
End Sub
何がどう変わったのかは大体見比べてくれるとわかるんじゃないかと思います
・VB5でいうLong型はVB.NETでいうInteger型
・構造体の宣言の仕方はVB5と違うので修正
…あんまり細かく書くと結構長いので中略
・LenB関数はVB.NETにはないのでMarshal.SizeOf関数で構造体のバイトのサイズを取得する
・AddressOf演算子で取得する関数のアドレスはVB5では多分Long型だが、VB.NETではデリゲート型なのでDelegateキーワードでデリゲートを定義
○SetWindowLong関数の定義で第3引数をデリゲート型にする。
・MoveMemory関数の定義でなんでもOK?なAny型はVB.NETではできないので型をRECTにする。2つ宣言して片方はInteger、RECT、Integerで片方はRECT、Integer、Integerの引数にする
・RECT構造体を引数に渡す際、ByValキーワードだと値渡しになるので参照渡しのByRefキーワードに書き換える
…エトセトラ!
まぁそんなこんなで一番頭を抱えさせたのは上記の青色の文
最終的には第3引数に<MarshalAs(UnmanagedType.FunctionPtr)>という属性をつけることで解決しますが、この属性がなければCallbackOnCollectedDelegateというエラーが出る
コールバックが、型 なんちゃらかんちゃら のガベージ コレクションされたデリゲートで行われました。これは、アプリケーションのクラッシュ、破損、およびデータの損失を発生させる可能性があります。デリゲートをアンマネージ コードに渡すとき、デリゲートは 2 度と呼び出されないことが確実になるまでマネージ アプリケーションによって維持されなければなりません。
わけわかめ。
マネージってのは・・・まぁ.NET FrameWorkを利用するプログラム
アンマネージってのは従来のネイティブプログラム…ここではWindowsAPI、SetWindowLong関数のこと
SetWindowLongの第3引数にデリゲート型を指定すると、コールバックしてアンマネージコードからマネージコードに帰ってくるときにガベージコレクション…使用メモリの整理が行われるため、関数のアドレスがごっちゃになって?危険だよ…的な感じかな…?
とにかく、アンマネージな引数にしたいので、
参考URL
http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet28/vb6tonet28_03.html
http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet23/vb6tonet23_01.html
痴漢
痴漢にあった
別にカワイイ女だったらいくらでも触らせてやるがおっさんでした
混雑気味の電車内で不自然な立ち位置から不自然に手が忍び寄りおいらのアレを甲で触れるおっさん
まぁまぁ、勘違いかもしれないと思い、始めは気にしてなかったが明らかに触ってきている
ウゼーとか思いながら次の駅で場所移動しようとしたら、漏れなくおっさんの手も途中までおいらのアレに付いてきてた
畜生!訴えておけばよかった!
別にカワイイ女だったらいくらでも触らせてやるがおっさんでした
混雑気味の電車内で不自然な立ち位置から不自然に手が忍び寄りおいらのアレを甲で触れるおっさん
まぁまぁ、勘違いかもしれないと思い、始めは気にしてなかったが明らかに触ってきている
ウゼーとか思いながら次の駅で場所移動しようとしたら、漏れなくおっさんの手も途中までおいらのアレに付いてきてた
畜生!訴えておけばよかった!
基本情報処理技術者試験
合格キタ!
午前・午後ともに合格ライン60点で、
午前の単純正答率 79% 自己採点
午前得点 83.75点
午後の単純正答率 72% 自己採点
午後得点 80.00点
ウワーイ
午前・午後ともに合格ライン60点で、
午前の単純正答率 79% 自己採点
午前得点 83.75点
午後の単純正答率 72% 自己採点
午後得点 80.00点
ウワーイ


