はじめに
- 前回の「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++
↓14行・313文字
#include <iostream>
#include <windows.h>
POINT pt;
int main(){
SetConsoleOutputCP(CP_UTF8);//カラー絵文字(utf-8)の文字化け対策
long t = 0;
while(1){
GetCursorPos(&pt);
std::cout << u8"C++時刻 : " << t << u8" ,🐖 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文字
Cargo.toml
[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文字
main.rs
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;」は知らんなー。
- カラーの絵文字の表示方法を生成AIから教えてもらう。
「C#」
- 「public」の記述いらんわー。
- GetCursorPosの括弧内に「out」が必要なのが、しっくりこない。
- GetCursorPosの前が「bool」なのは、調べなきゃ知らない。
「Go」
- 「uintptr(unsafe.Pointer(&pt)」が難しい。
「Rust」
- マイクロソフトの「Windowsのwin32クレート」を使ってます。
- 「mem::zeroed();」を使う理由は、全然わかってないですが、動けばOK。
- 「unsafe」って所有権がなくなる意味と私は理解しました。
参考にしたサイト
C++
C#
Go
Rust