質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

3989閲覧

PythonでWindows APIを使う方法(SetConsoleCursorInfo)

Karasuryu

総合スコア52

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/02 04:21

編集2020/05/02 04:22

以下のコードと同等のことをPythonで実装したいのですが、Windows APIの使い方とそれをPythonコードに変換する方法がわかりません。以下のコードはPythonで実装可能ですか?

c

1#include <Windows.h> 2 3int main(void) 4{ 5 HANDLE hStdOut = NULL; 6 CONSOLE_CURSOR_INFO curInfo; 7 8 hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); 9 GetConsoleCursorInfo(hStdOut, &curInfo); 10 curInfo.bVisible = FALSE; 11 SetConsoleCursorInfo(hStdOut, &curInfo); 12 13 return 0; 14}

要するに、コンソールのカーソルを隠したいのですが、いかんせんctypesやwin32などの使い方がよく分かっておらず、困っています。該当の関数を"Python"と共に検索してもwin32guiのGetCursorInfoが出てくるくらいでうまく見つけられませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

コンソールのカーソルを隠したい

curses/ncurse 辺りのライブラリで提供されてそうですが、、
pywin32で、提示されたコード通りにやるならこんな感じでしょうか。

手元の環境が古くて ActivePython 2.7 ですが、3.xでも問題ないはず。
win32関連のライブラリは ActivePython ならインストール済みです。

python

1# -*- coding: utf-8 -*- 2from ctypes import Structure, windll, byref, c_byte, c_int 3from win32api import GetStdHandle 4from win32console import STD_OUTPUT_HANDLE 5 6# 構造体は、定義済みのが見つからない場合自分で定義。 7# フィールド名は自由ですが、型のサイズに注意 8# https://docs.microsoft.com/en-us/windows/console/console-cursor-info-str 9 10class CONSOLE_CURSOR_INFO(Structure): 11 _fields_ = [ 12 ('dwSize', c_int), 13 ('bVisible', c_byte) 14 ] 15 16GetConsoleCursorInfo = windll.kernel32.GetConsoleCursorInfo 17SetConsoleCursorInfo = windll.kernel32.SetConsoleCursorInfo 18 19def main(): 20 curInfo = CONSOLE_CURSOR_INFO() 21 handle = GetStdHandle(STD_OUTPUT_HANDLE) 22 GetConsoleCursorInfo(handle, byref(curInfo)) 23 curInfo.bVisible = True 24 SetConsoleCursorInfo(handle, byref(curInfo)) 25 26if __name__ == '__main__': 27 main()

コンパイル時チェックがないので、構造体のフィールド名でtypoがあったとき、
エラーも何もなくデバッグに少し手間取りました。

投稿2020/05/02 05:35

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Karasuryu

2020/05/02 06:08

なるほど、cursesというものがあるのですね。情報ありがとうございます。 しかし私のWindows10 64bit Python3.6.8環境だとなぜか動かないようです。 まず File "C:\Program Files\Python36\lib\curses\__init__.py", line 13, in <module> from _curses import * ModuleNotFoundError: No module named '_curses' 次にここhttps://quwahara.hatenablog.com/entry/2012/02/23/000639 の情報をもとに pip install "curses-2.2.1+utf8-cp36-cp36m-win32.whl" してみましたが、 ERROR: curses-2.2.1+utf8-cp36-cp36m-win32.whl is not a supported wheel on this platform. となりました。 ちょっとよくわからないです…。 ご回答のコードは自己解決の方のコードとほぼ同じですね。やはりこれがベストアンサーですかね。
teamikl

2020/05/02 06:58

(試してませんが) 少し情報が古いようで、こちらですね https://pypi.org/project/windows-curses/ ActivePythonでなら win32console モジュールを使った方法がありそうですが、 ctypes のみを使た自己解決されたコードの方が良いです。 他に win32関連のAPIを扱わなければ、ActivePythonは不要なので。
teamikl

2020/05/02 07:22 編集

訂正:リンク先のさらに先のサイトの whl を提供してるところは古くなかったようです。 更新日時が 2020/May1 でした。 上記のエラーは、インストールしようとしたファイルが お使いのPythonの環境と一致してない様です。32/64bit の違いかな。 但し、希望の用途に合うかどうかはわかりません。 目的がカーソル非表示のみなら他のライブラリも使えそうです。 https://github.com/GijsTimmers/cursor (中のコードはほぼ同じ)
Karasuryu

2020/05/02 09:30

なるほど、やはり今回の場合は純粋にctypesを使うのがベストアンサーのようですね。 いろいろと調査ありがとうございました。
guest

0

自己解決

こちらの素晴らしいお方のサンプルを発見し、無事実装できました。
コンソールのクリア、カーソル制御 - baruthのメモblog

py

1import ctypes 2 3STD_OUTPUT_HANDLE = -11 4std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) 5 6class CONSOLE_CURSOR_INFO(ctypes.Structure): 7 _fields_ = [ 8 ("dwSize", ctypes.c_int), 9 ("bVisible", ctypes.c_byte)] 10 11def cursor_on_off(visible): 12 info = CONSOLE_CURSOR_INFO() 13 if ctypes.windll.kernel32.GetConsoleCursorInfo(std_out_handle, ctypes.byref(info)): 14 info.bVisible = visible 15 ctypes.windll.kernel32.SetConsoleCursorInfo(std_out_handle, ctypes.byref(info)) 16 17cursor_on_off(False)

投稿2020/05/02 04:51

編集2020/05/02 04:55
Karasuryu

総合スコア52

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答ではないですが、
そういう用途ならエスケープシーケンスを使えばどうでしょう
「コマンドプロンプト エスケープシーケンス」でぐぐると解説が出てきます

投稿2020/05/02 04:34

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Karasuryu

2020/05/02 04:48 編集

ちょっとググったところ、カーソルの非表示には\x1b[?25lなどと出てきますが、こちらの環境では非表示にできませんでした。pythonのcoloramaというライブラリを使って他のエスケープシーケンスは反映できる状態ではあるのですが...よくわかりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問