🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

4056閲覧

HWND型のwstring型へのキャスト方法

Sans

総合スコア14

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/12/12 16:28

前提・実現したいこと

言語:Visual C++
環境:Visual Studio2017 Express

実現したいこと:HWND型のwstring型へのキャスト方法を知りたい

該当のソースコード

VisualC++

1#include "pch.h" 2#include <iostream> 3#include <windows.h> 4#include <locale> 5 6int main() 7{ 8 HWND hwnd = GetForegroundWindow(); 9 std::wstring ws = L"HWND is "; 10 11 // ここに `ws` と `キャストしたhwnd` の連結処理を入れたい 12 13 std::wcout << ws << "\n"; 14}

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

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

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

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

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

guest

回答1

0

ベストアンサー

HWND型のwstring型へのキャスト方法を知りたい

キャストと言うよりは、HWND型とwstring型では完全に型の性質が違うので、HWND型変数の値を文字列にしてwstring型の変数に入れるようなやり方になるかと思います。

C++

1#include "pch.h" 2#include <Windows.h> 3#include <iostream> 4#include <locale> 5 6#include <sstream> 7#include <iomanip> // std::setw, std::setfill 8 9int main() 10{ 11 HWND hwnd = GetForegroundWindow(); 12 // hwnd = (HWND)0xab1234; 13 14 wchar_t wsbuf[32]; 15 std::wstring result; 16 17 // HWND は PVOID (void*) 型のtypedefなので 18 19 // (1) HWNDをポインタとして扱うなら 20 wsprintf(wsbuf, L"%p", hwnd); 21 result = L"HWND(%p) is " + std::wstring(wsbuf); 22 std::wcout << result << std::endl; 23 24 // (2) UINT(UINT_PTR)として扱うなら 25 wsprintf(wsbuf, L"%08X", (UINT_PTR)hwnd); 26 result = L"HWND(%08X) is " + std::wstring(wsbuf); 27 std::wcout << result << std::endl; 28 29 // (3) std::stringstream を使うなら 30 std::wstringstream stream; 31 stream << std::setw(8) << std::setfill(L'0') << hwnd; 32 std::wstring temp = stream.str(); 33 34 std::wstring ws = L"HWND is "; 35 result = ws + temp; 36 std::wcout << result << std::endl; 37 38 return 0; 39}

コマンドプロンプトでの実行例です。

CMD

1C> t1.exe 2HWND(%p) is 00AB1234 3HWND(%08X) is 00AB1234 4HWND is 00AB1234 5 6C>

Visual Studio 2017 Professional版で確認しました。実行ファイルは32ビット版で作成したのでHWND型の値は16進数8桁(%08X)としましたが、64ビット版とする場合や、頭の0が不要なのであれば適切に変更してください。

投稿2019/12/12 18:10

dodox86

総合スコア9256

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

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

Sans

2019/12/12 23:04

素早いご回答ありがとうございます。 実現したい内容ができております。大変感謝申し上げます。 更問いになりますが、32ビット版と64ビット版では、コードを変える必要があるのでしょうか。実行ファイルは64ビット版で作成する予定ですが、どちらの環境でも動作することが望ましいです。
yumetodo

2019/12/13 01:09

その場合はwstringstream 使っとけばいいと思います。
dodox86

2019/12/13 01:32

> yumetodoさん サンプルのコード中、分かりづらかったかもしれませんが、wstringstream を使っています。
dodox86

2019/12/13 01:36

>BansPさん 32ビット版ビルドの場合はポインタは32ビットであり、64ビット版ビルドの場合、ポインタは64ビットになります。結果的にHWND型もそれに沿いますが、例えばhwnd=0x123abcであるとして、wsprintf(wsbuf, L"%p", hwnd); のコードは32ビット版であれば"00123ABC"となるし、64ビット版であれば"0000000000123ABC"となります。頭の"0"が必要ないのであれば、 wsprintf(wsbuf, L"%X", (UINT_PTR)hwnd); などとすれば、不要な"0"が無くなるので、そうした方が良いのかもしれません。ご要望の動きに合わせてください。 std::wstingstreamはご提示のコードがwstring等を使っていたからついでに示したのですが、 std::setbase(基数)やstd::setw(幅), std:setfill(埋める文字) の使用が煩雑なきらいもあります。 stream << hwnd; とするとhwnd がポインタとして扱われますが、 stream << (UINT_PTR)hwnd; とすると数値で扱われるので、以下のように書式設定が必要になるかもしれません。 stream << std::setbase(16) << std::setw(8) << std::setfill(L'0') << (UINT_PTR)hwnd; これはちょっとやり過ぎかもしれませんね。ご要望の動きに合わせて取捨選択してください。
yumetodo

2019/12/13 01:46

> サンプルのコード中、分かりづらかったかもしれませんが、wstringstream を使っています。 わかっているのでwstringstream使えばいいと書いてsampleは書きませんでした。 --- fmtlib/fmtを使いたくなりますよね、マニピュレータだるいので
dodox86

2019/12/13 01:57

>yumetodoさん 更なるフォロー、どうもありがとうございます。承知いたしました。 > fmtlib/fmtを使いたくなりますよね、マニピュレータだるいので 仰るとおりですね。私も色々試してみて少しうんざりしました。 ---- >BansPさん ちなみに私が書いたサンプルコード中でwsprintfを使っていますが、これはWindows API版(wsprintfA, wsprintfW)です。 https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-wsprintfa よりセキュアなランタイムライブラリ版のswprintf_sなどの使用が推奨されていますので、適時、置き換えをご検討ください。書式指定の"%p"も使えます。 https://docs.microsoft.com/ja-jp/cpp/c-runtime-library/reference/sprintf-s-sprintf-s-l-swprintf-s-swprintf-s-l?view=vs-2019
Sans

2019/12/13 14:25

>dodox86さん 32ビット版と64ビット版でポインタのサイズが変わってくるのですね。例示がとても理解の助けとなりました。色々方法があるということが分かりましたので、うまく取捨選択したいと思います。 swprintf_sについても、ご丁寧に補足いただきありがとうございました。 >yumetodoさん wstringstream の推奨のご意見ありがとうございます。 また、fmtlib/fmtの情報もありがたいです。別途試してみたいと思います。
yumetodo

2019/12/14 01:50

言い忘れましたがC++20でfmtlib/fmtに近い、std::formatが入った気がします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問