※ ChatGPTを利用し、要約された質問です(原文:C#: DLL関数に整数の参照を渡すには?)
C# DLL関数に整数の参照を渡す方法
このQ&Aのポイント
Visual Studio 2012のC#でDLL関数に整数の参照を渡すプログラムを作成しましたが、期待通り動作しません。
マウスのボタンの数を取得してラベルとメッセージボックスに表示するプログラムですが、初期値の8が表示されて参照による取得ができません。また、GetNumberOfConsoleMouseButtons()の戻り値もFalse(0)が表示されます。
GetNumberOfConsoleMouseButtons()の使い方について教えてください。
前略
@IT の”Win32 APIやDLL関数を呼び出すには?”(下記URL)を読んでVisual Studio 2012のC#をつかって、DLL関数に整数の参照を渡すプログラムをつくったのですが期待通り動作しません。
http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html
以下のソースコードのどこが間違っているのでしょうか? わかる方がいらっしゃったら教えてください。
・マウスのボタンの数を取得して ラベルとメッセージボックスに表示するプログラムですが、いずれも 初期値の8が表示されて 参照による取得がうまくできません。また、GetNumberOfConsoleMouseButtons( ) の戻り値もFlase(0)が表示されます。
・GetNumberOfConsoleMouseButtons( ) の諸元は下記です。
BOOL GetNumberOfConsoleMouseButtons(
LPDWORD lpNumberOfMouseButtons // ボタン数のアドレス
);
パラメータ
lpNumberOfMouseButtons: マウスのボタン数を受け取る 32 ビット変数へのポインタを指定します。
戻り値
関数が成功すると、0 以外の値が返ります。
関数が失敗すると、0 が返ります。
以上、よろしくお願いします
以下、Form1.cs 全ソースコードです。
//----------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices; // 追加
namespace DLL_呼出し_参照
{
public partial class Form1 : Form
{
//宣言部
[DllImport("kernel32.dll")]
extern static bool GetNumberOfConsoleMouseButtons(ref uint lpNumberOfMouseButtons);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
uint Num;
bool Flag;
Num = 8;
Flag = GetNumberOfConsoleMouseButtons(ref Num); //関数の呼び出し
label1.Text = Num.ToString();
label2.Text = Flag.ToString(); //戻り値 成功すると0以外が戻る
string msg = String.Format("Num={0}",Num);
MessageBox.Show(msg); //メッセージボックス表示
}
}
}
お礼
wormhole 様 前略 ・コンソールプログラムに変更したらうまくマウスのボタン数がかえってきました。ありがとうございます。 実行結果(コンソール画面のコピー)とプログラムを以下に添付します。 <追記>尚、実験したところ リード線付のマウス×2個では 添付の実行結果のどうりボタン数が3で外観と一致するのですが、通常私がつかっているワイヤレスマウス(ロジクール製)の場合同様にボタン数は3個に見えますが 何故か実行結果ではボタン数が16個となります。昨日はこの16個がプログラムが意図と違う動作をしているのではないかと思い昨日は1日悩んでいました。マウスによってはソフト的に16個もボタンがあるマウスもあるのでしょうかね.......??? //実行結果---------------------------------------------------------- DLL呼出し前: Num = 8 DLL呼出し前: Flag = False DLL呼出し後: Num = 3 DLL呼出し後: Flag = True 続行するには何かキーを押してください . . . //プログラム--------------------------------------------------------------- //Program.cs //GetNumberOfConsoleMouseButtons( )によりマウスのボタン数を取得するプログラム using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; // 追加 namespace DDL_Get_NumMouseBtn { class Program { //宣言部 [DllImport("kernel32.dll")] extern static bool GetNumberOfConsoleMouseButtons(ref uint lpNumberOfMouseButtons); static void Main(string[] args) { uint Num; bool Flag = false; Num = 8; Console.Write("DLL呼出し前: Num = {0:d}\n", Num); Console.Write("DLL呼出し前: Flag = {0:d}\n", Flag); Flag = GetNumberOfConsoleMouseButtons(ref Num); //関数の呼び出し Console.Write("DLL呼出し後: Num = {0:d}\n", Num); Console.Write("DLL呼出し後: Flag = {0:d}\n", Flag); } } }