C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: VB.NETでGetCursorPosを使いたい


(過去ログ 27 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■12407 / inTopicNo.1)  VB.NETでGetCursorPosを使いたい
  
□投稿者/ ○ (1回)-(2008/01/09(Wed) 14:03:10)

分類:[.NET 全般] 

こんにちは。はじめまして。
プログラミング初心者です。

VB.NETでGetCursorPosを使いたいなあと思いやってみたのですが駄目な感じです。

Structure POINTAPI
Public X As Integer
Public Y As Integer
End Structure
Declare Function GetCursorPos Lib "user32.dll" (ByVal lpPoint As POINTAPI) As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim A As POINTAPI
GetCursorPos(A)
End Sub

例えば上のようにするとしたのエラーが出てしまいます。
------------
PInvoke 関数 'WindowsApplication2!WindowsApplication2.Form1::GetCursorPos' がスタックを不安定にしています。PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが原因として考えられます。呼び出し規約、および PInvoke シグネチャのパラメータがターゲットのアンマネージ シグネチャに一致していることを確認してください。
------------
なんででしょうか?
引用返信 編集キー/
■12408 / inTopicNo.2)  Re[1]: VB.NETでGetCursorPosを使いたい
□投稿者/ επιστημη (766回)-(2008/01/09(Wed) 14:10:04)
επιστημη さんの Web サイト
GetCursorPosを使うのが目的ですか?
マウスポインタの位置を知るのが目的ですか?

後者であれば
System.Windows.Forms.Control.MousePosition
System.Windows.Forms.Cursor.Position
あたりが使えそうですが。

引用返信 編集キー/
■12409 / inTopicNo.3)  Re[2]: VB.NETでGetCursorPosを使いたい
□投稿者/ ○ (2回)-(2008/01/09(Wed) 14:12:50)
No12408 (επιστημη さん) に返信
> GetCursorPosを使うのが目的ですか?
> マウスポインタの位置を知るのが目的ですか?
>
> 後者であれば
> System.Windows.Forms.Control.MousePosition
> System.Windows.Forms.Cursor.Position
> あたりが使えそうですが。
>
回答ありがとうございます。
ご提示のものでも大丈夫そうですが、GetCursorPosがなぜ使えないかも知りたい感じです。
わがまま申しましてすみません。
お分かりになるようであれば、教えてください。
引用返信 編集キー/
■12410 / inTopicNo.4)  Re[2]: VB.NETでGetCursorPosを使いたい
□投稿者/ 魔界の仮面弁士 (557回)-(2008/01/09(Wed) 14:17:41)
# たぶん後者だとは思いますが。

No12408 (επιστημη さん) に返信
> GetCursorPosを使うのが目的ですか?
> マウスポインタの位置を知るのが目的ですか?

前者であれば、Declare部を ByVal ではなく、ByRef にする必要があります。
(POINT 構造体へのポインタを指定する必要があるので)

Declare Function GetCursorPos Lib "user32" (ByRef lpPoint As POINTAPI) As <MarshalAs(UnmanagedType.Bool)> Boolean
引用返信 編集キー/
■12411 / inTopicNo.5)  Re[3]: VB.NETでGetCursorPosを使いたい
□投稿者/ ○ (3回)-(2008/01/09(Wed) 14:19:21)
No12410 (魔界の仮面弁士 さん) に返信
> # たぶん後者だとは思いますが。
>
> ■No12408 (επιστημη さん) に返信
>>GetCursorPosを使うのが目的ですか?
>>マウスポインタの位置を知るのが目的ですか?
>
> 前者であれば、Declare部を ByVal ではなく、ByRef にする必要があります。
> (POINT 構造体へのポインタを指定する必要があるので)
>
> Declare Function GetCursorPos Lib "user32" (ByRef lpPoint As POINTAPI) As <MarshalAs(UnmanagedType.Bool)> Boolean

うわあ、ありがとうございます!そりゃあそうだあ、って感じです。感謝です!
申し訳ないです。いつもByvalとかなんとかはVSが勝手に作ってくれるのに任せちゃっていた感じです。

引用返信 編集キー/
■12412 / inTopicNo.6)  Re[4]: VB.NETでGetCursorPosを使いたい
□投稿者/ ○ (4回)-(2008/01/09(Wed) 14:21:13)
ちなみに、魔界の仮面弁士さん、色々なところで素敵な回答されているのを何度か読ませてもらってます。
博識ですなあ、良いですなあ、私もそうなりたいなあ。επιστημηもどうもありがとうございました。大変助かりました!
引用返信 編集キー/
■12413 / inTopicNo.7)  Re[3]: VB.NETでGetCursorPosを使いたい
□投稿者/ オガシン (1回)-(2008/01/09(Wed) 14:21:41)
No12409 (○ さん) に返信

こんにちは オガシンと申します。
問題の参考になれば。。

> ご提示のものでも大丈夫そうですが、GetCursorPosがなぜ使えないかも知りたい感じです。
> お分かりになるようであれば、教えてください。

user32DLLのGetCursorPos関数をMSDNでみると引数は「POINTAPI」構造体のポインタになってました。

旧-> Declare Function GetCursorPos Lib "user32.dll" (ByVal lpPoint As POINTAPI) As Integer
新-> Declare Function GetCursorPos Lib "user32.dll" (ByRef lpPoint As POINTAPI) As Integer
とByValをByRefにすればよいと思います。

一応 VB2005で実行したら動きました。
よろしくおねがいします。
引用返信 編集キー/
■12414 / inTopicNo.8)  Re[5]: VB.NETでGetCursorPosを使いたい
□投稿者/ オガシン (2回)-(2008/01/09(Wed) 14:23:32)
一足遅かったようですね(汗

失礼しました^^;
引用返信 編集キー/
■12415 / inTopicNo.9)  Re[3]: VB.NETでGetCursorPosを使いたい
□投稿者/ επιστημη (767回)-(2008/01/09(Wed) 14:24:40)
επιστημη さんの Web サイト
Declare Function GetCursorPos Lib "user32.dll" (ByRef pos As Point) As Boolean

と宣言しておいて

Dim p As Point
GetCursorPos(p)

みたいに使う。

引用返信 編集キー/
■12416 / inTopicNo.10)  Re[3]: VB.NETでGetCursorPosを使いたい
□投稿者/ 魔界の仮面弁士 (558回)-(2008/01/09(Wed) 14:27:10)
No12409 (○ さん) に返信
> ご提示のものでも大丈夫そうですが、GetCursorPosがなぜ使えないかも知りたい感じです。

Declare 宣言を「ByVal POINTAPI」にしたいなら、こんな感じ。


Imports system.Runtime.InteropServices
Public Class Form1
    <StructLayout(LayoutKind.Sequential, Pack:=4)> Class POINTAPI
        Public X As Integer
        Public Y As Integer
        Public Shared Widening Operator CType(ByVal o As POINTAPI) As String
            Return String.Format("(X, Y)=({0}, {1})", o.X, o.Y)
        End Operator
    End Class

    Declare Function GetCursorPos Lib "user32" (ByVal lpPoint As POINTAPI) _
        As <MarshalAs(UnmanagedType.Bool)> Boolean

    Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
        Dim A As New POINTAPI()
        GetCursorPos(A)
        Me.Text = A
    End Sub

    Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        Timer1.Interval = 100
        Timer1.Enabled = True
    End Sub
End Class

引用返信 編集キー/
■12418 / inTopicNo.11)  Re[6]: VB.NETでGetCursorPosを使いたい
□投稿者/ ○ (5回)-(2008/01/09(Wed) 14:41:46)
No12414 (オガシン さん) に返信
> 一足遅かったようですね(汗
>
> 失礼しました^^;

オガシンさん

ああ、オガシンのほうが回答早かったですね。私、ボーっとしてました。すみません。
遅くないです、失礼でないです。ありがとうございました!申し訳ないです!
引用返信 編集キー/
■12419 / inTopicNo.12)  Re[7]: VB.NETでGetCursorPosを使いたい
□投稿者/ 魔界の仮面弁士 (559回)-(2008/01/09(Wed) 14:51:35)
No12418 (○ さん) に返信
> ありがとうございました!
解決した場合には、「解決済み」のチェックにご協力を。m(_ _)m


それと、敬称がうっかり抜けているようです。一応ツッコミ。

No12409
> επιστημηも

No12418
> オガシンのほうが
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -