はじめに
-
- 前回の「WIn32のGetAsyncKeyState」によるキーボード入力編の続きです。
-
- 今回の座標は「パソコン画面のマウス・カーソル」の座標です。「WindowsTerminal」内の座標ではないので注意です。
- ↓前回
各言語「C++,C#,Go,Rust」のプログラムの作成条件
-
- Visual studio codeや秀丸でプログラミング。
-
- プログラミング中、マウスは適当に動かします。
-
- 300ミリ秒ごとにループ(繰り返し)する。
-
- ループを一周する毎に、変数「t」の値を「1」増やす。
-
- GetCursorPosの座標情報の出力は、変数「pt」に格納する。
-
- 絵文字を使いたいのでファイルはutf-8で保存する。
- (C++は日本語や絵文字が文字化けした!)
パソコン環境
-
- Windows10 : 22H2
-
- WindowsTerminal(プレビュー版) : 1.19.2831.0
-
- c++のコンパイラ g++ : 10.3.0
-
- C#のコンパイラ csc : 4.8.9037.0
-
- Go : 1.21.3
- Rust : 1. 72.0
プログラミング結果
C++
↓15行・251文字
#include <iostream>
#include <windows.h>
POINT pt;
int main(){
long t = 0;
while(1){
GetCursorPos(&pt);
std::cout << "time : " << t << " , x:y = " << pt.x <<" : "<< pt.y << std::endl;
Sleep(300);
t++;
}
return 0;
}
C++出力結果
C#
↓22行・569文字
using System;
using System.Threading;
public struct POINT{
public int x;
public int y;
}
class hello_GetCursorPos {
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool GetCursorPos(out POINT lpPoint);
public static void Main() {
Console.OutputEncoding = System.Text.Encoding.GetEncoding("utf-8");//?の文字化け対策
int t = 0;
while(true){
POINT pt;
GetCursorPos(out pt);
Console.WriteLine("C# 時刻:{0} マウスのカーソル座標? x:y= {1}:{2}",t,pt.x,pt.y);
Thread.Sleep(300);
t++;
}
}
}
C#出力結果
Go言語
↓30行・483文字
package main
import (
"fmt"
"time"
"unsafe"
"golang.org/x/sys/windows"
)
var (
moduser32 = windows.NewLazyDLL("user32.dll")
procGetCursorPos = moduser32.NewProc("GetCursorPos")
)
type POINT struct {
X int32
Y int32
}
func main() {
t := 0
pt := POINT{}
for {
procGetCursorPos.Call(uintptr(unsafe.Pointer(&pt)))
fmt.Println("Go 時刻 : ", t, "?マウスのカーソル座標 x:y = ", pt.X, " : ", pt.Y)
time.Sleep(300 * time.Millisecond)
t++
}
}
Rust
↓7行・187文字
[package]
name = "mouse_position_in_gamen"
version = "0.1.0"
edition = "2021"
[dependencies]
windows = { version = "0.51.1",features=["Win32_UI_WindowsAndMessaging","Win32_Foundation",]}
↓17行・約430文字
use std::mem;
use std::thread;
use std::time::Duration;
use windows::Win32::UI::WindowsAndMessaging::GetCursorPos;
fn main() {
let mut t = 0;
loop {
unsafe {
let mut pt = mem::zeroed();
let _ = GetCursorPos(&mut pt);
println!("Rust GetCursorPos? 時刻:{:?} 座標 x:y= {:?}:{:?}", t, pt.x,pt.y);
};
thread::sleep(Duration::from_millis(300));
t = t + 1
}
}
感想
以下は「C」「JavaScript」「VBA」「Go」で趣味で遊んだ経験を踏まえての感想です。
「C++」
-
- 相変わらず最もシンプルに書ける。
- 「POINT po;」は知らんなー。
「C#」
-
- 「public」の記述いらんわー。
-
- GetCursorPosの括弧内に「out」が必要なのが、しっくりこない。
- GetCursorPosの前が「bool」なのは、調べなきゃ知らない。
「Go」
- 「uintptr(unsafe.Pointer(&pt)」が難しい。
「Rust」
-
- マイクロソフトの「Windowsのwin32クレート」を使ってます。
-
- 「mem::zeroed();」を使う理由は、全然わかってないですが、動けばOK。
- 「unsafe」って所有権がなくなる意味と私は理解しました。
参考にしたサイト
C++
C#
Go
Rust