DOBON.NET DOBON.NETプログラミング掲示板過去ログ

keybd_eventの使用でエラー

環境/言語:[Windows Vista Business VB2005]
分類:[.NET]

キーの動作をシミュレートするソフトを作っているのですが、Win32APIを使用した部分でエラーが出てしまいます。

Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Call keybd_event(&H5B, 0, 0, 0)'Windowsキーを押す
Call keybd_event(&H5B, 0, 2, 0)'Windowsキーをあげる
End Sub

このコードを動作させたところ、
「PInvoke 関数 'TEST!TEST::keybd_event' がスタックを不安定にしています。PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが原因として考えられます。呼び出し規約、および PInvoke シグネチャのパラメータがターゲットのアンマネージ シグネチャに一致していることを確認してください。」
とのエラー(?)が出てしまいます。

SendkeysではWindowsキーや、IME変換キーのシミュレートができなかったため、Win32APIを利用しようと考えています。

また、このコードをコンパイルし実行すると、エラーは出ず無事に動作します。
この「PInovoke 関数'TEST!TEST.....」のメッセージは無視しても大丈夫なのでしょうか?
■No21103に返信(村の屋さんの記事)

> このコードを動作させたところ、
> 「PInvoke 関数 'TEST!TEST::keybd_event' がスタックを不安定にしています。PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが原因として考えられます。呼び出し規約、および PInvoke シグネチャのパラメータがターゲットのアンマネージ シグネチャに一致していることを確認してください。」
> とのエラー(?)が出てしまいます。

私はkeybd_eventについて詳しく知りませんが、メッセージの通りなら、シグネチャが違うのではないでしょうか。

> Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

たぶん引数の最後が…
ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer
ではないのでしょうか。
> たぶん引数の最後が…
> ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer
> ではないのでしょうか。

VB6からコピペしたのかな?
VB6のLongはVB.NETではIntegerということですね。

#Integerを超えるLong値を渡すと落ちるかも。
IIJIMASさん、まどかさん、返信ありがとうございます。

そのコードは確かにVB6からのコピペです…。
色々と調べてみたのですが、全てLongだったのでこれであっているのかと思っていました。
また、LongからIntegerに変更したところ、無事に動作するようになりました。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板