アプリ版:「スタンプのみでお礼する」機能のリリースについて

Microsoft Visual Studio Community 2022 (64 ビット) - Current Version 17.5.5のC#で
Windows Form アプリケーション(.Net Framework4.8)を作成して
そこで次のようにしてbutton1を押してコンソールに文字を出力したかったのですが、
コンソールは出るのですが文字が出力されないです。
これはなぜなのでしょうか?

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;

namespace CallConsoleWindow
{
public partial class Form1 : Form
{
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool AllocConsole();

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
AllocConsole();
Console.WriteLine("test");
Console.ReadLine();
}
}
}

A 回答 (8件)

あと考えられるとすると、コンソールのエンコーディングは、ShiftJISなので、WriteLen()がUnicode出力になっていると、NULLを検出するので、ストリングがないという判断かもしれません


日本語で、テストという文字列と、boolで、true

Console.WriteLine(”テスト”);
Console.WriteLine(true);

で書き込めるがテストしていただけますか?


これで、出力されるとなると、VSのビルドオプションの設定の変更の影響のようにも思えます
    • good
    • 0
この回答へのお礼

ご返信ありがとうございます。

それを試してみたのですが、やはり表示されませんでした。

ただそれからいろいろ試してみたのですが、
「出力の種類」を「コンソールアプリケーション」にしたら表示されました。
ちなみにその状態で一応MessageBox.Show()も使用してみたのですが
これも表示されました。
https://s.kota2.net/1683878055.jpg
https://s.kota2.net/1683878031.jpg

普段は「出力の種類」は「Windows アプリケーション」になっているですが、
この設定のまま使っても良いのでしょうか?

お礼日時:2023/05/12 16:57

色々と確認作業、また、スクショなど撮って頂きありがとうございました



質問者さんの環境には、Insiderにも入っていないようですし、あとは、自分の環境が、Windows Proや、WSL2ぐらいで、こちらが特殊な環境かもしれません

今、一度、コンソールが起動に書き込みができるアプリ(設定がWindowsアプリケーションの場合)をタスクマネージャーで確認したところ

子プロセスとして、C:\Windows\System32\conhost.exeがコンソールアプリとして、起動していました
System32下に存在するので、セキュリティの変更などは出来ませんでしたが、このファイルを実行する場合に、質問者さんの環境と、自分の環境で、何かしらの違いが発生してるのだと思います

出力の種類を「コンソールアプリケーション」にした場合、タスクマネージャーで確認しましたが、自分の環境では、別のプロセスとして、WindowsConsole.exeが立ち上がってるので、問題があるかどうかは、分かりかねますが1行ごとに出力を確認したいという、目的が達成できるのであれば、良いと思います
    • good
    • 0
この回答へのお礼

ご返信ありがとうございます。

こちらでもタスクマネージャーで見たところ
C:\Windows\System32\conhost.exeが
ユーザー名で4つ
SYSTEMで2つ
ありました。
https://s.kota2.net/1683901881.png
Visual Studioで他のプログラムは実行していないのですが、
なんでこんなに多くあるのかが謎です(汗)

まあとりあえず目的は達成できそうなのでこれで良しとします。
回答にご尽力いただきありがとうございました。

お礼日時:2023/05/12 23:38

色々弄ってみましたが、consoleに変更しなければいけないような部分は、見当たりませんでした



そうなると、環境の違いが関係しそうな部分は

自分:WSL2を入れてる
質問者さん:Insdier Previewではないですか?

WSL2を入れてますが、新しく作ったユーザーではWSL2はdisable状態で、新規に作ったWinFormアプリで問題なく、コンソールに表示されました


で、気になったのが、質問者さんの環境って、Windows Insider Programに参加されてますよね?

もし、そうだとすると、それしか考えられないんですよね

Insiderを停止して、元に戻して試すか、他にIndsider に参加してないPCがあれば、新規にWindowsFormのアプリを作ったときに、問題がないかでしょうか?
    • good
    • 0
この回答へのお礼

ご返信ありがとうございます。

「Windows Insider Program」ってこのことでしょうか?
https://s.kota2.net/1683894841.jpg

「使用を開始する」とあるので、まだ参加してないと思うのですが
どうなんでしょうか?

No.6でも書きましたが、一応「出力の種類」をコンソールアプリケーションに変更したら
できましたので、Windowsフォームアプリで使用する際、これで問題がないようでしたら
この設定で使っていきたいと思っています。
ただデフォルトの設定ではないので気持ち悪い感じはしますが(汗)

お礼日時:2023/05/12 21:38

確認ありがとうございます。



ReadLine()はEnterキーが入力されるまで、入力を待つので何かキーを入力すると、表示されます。

Admin権限は、PCのアカウントの設定で管理者かどうかというものですが、管理者でないユーザーアカウントを作成し、新規にプロジェクトを作成し、作ってみましたが、問題なく出来るので、質問者さんの環境が壊れてる可能性か、他のケースが考えられます


その一つとして、色々な設定を見ても問題ないので、Formアプリが起動している際のコンソール出力が、どこかにリダイレクトされているような設定になってるように思えます

つまり、VSで作成したプログラムをほかのプログラムで起動して実行して、確認してる等は、ないでしょうか?
https://learn.microsoft.com/ja-jp/dotnet/api/sys …

そうでなければ、一度、Visual Studio 2022のリペアを試してみてはいかがでしょうか?
https://learn.microsoft.com/ja-jp/visualstudio/i …

リペアをしたのちに、新規作成をしたソリューションを再度、リビルドをしていただき、ビルド出力にエラーがないことを確認していただき、

========== すべて再構築: 1 正常終了、0 失敗、0 スキップ ==========

とWriteLine()が、表示されていることを確認していただけますでしょうか?


これで、解決できない場合には、申し訳ないですが、お手上げですね。VSを再インストールしても、問題が起きるように思えます。
    • good
    • 0
この回答へのお礼

ご返信ありがとうございます。

Admin権限の件ですが、たぶんAdmin権限になっているようです。
https://s.kota2.net/1683858345.jpg

>VSで作成したプログラムをほかのプログラムで起動して実行して、確認してる等は、ないでしょうか?
これって要は
new Process().Start();を使って呼び出して試しているということですよね?
いや添付画像で分かる通りNo.2のよっしーラボさんが提示されたコードをそのまま実行しているだけです。
ただもしこの件が解決しないようならnew Process().Start();で呼び出してなんとか使用できないか考えています。

Visual Studio 2022のリペアをして、ソリューションを新規作成して
リビルドして実行してみたのですが、やはり表示されませんでした。
https://s.kota2.net/1683858358.png

Console.WriteLineではなくて、Console.Beep();を追加してみたら
ちゃんと音が鳴っていたので、どうやらWriteLineだけが機能してないみたいなんですよね・・・
https://s.kota2.net/1683859026.jpg
Console.Title = "タイトルの変更";でタイトルの変更もできています。
https://s.kota2.net/1683859451.jpg
ちなみにConsole.CursorLeftでカーソルの移動をしようとしたのですが、これはエラーが出ます。
https://s.kota2.net/1683859610.jpg

うーん、、なにが原因なんだろう・・・

お礼日時:2023/05/12 11:49

確認ありがとうございます



・念のため、コンソールのバックグラウンドと、フォアグランドカラーの設定をして、かつ、WriteLine()したあとに、ReadLine()で止めても、表示は出ないでしょうか?

・あとは、新規でフォームアプリを作って、自分が提示した方法で、同じようにボタンだけのコントロールを新規作成し、同じ問題が起きるか?起きないか?の確認ぐらいでしょうか

・もし、それでも表示されないのであれば、あとは、今まで動作していた、コンソールへの書き込みプログラムが正常に動作しているか?ですね

・念のため、PCの再起動をかけるのもありです

・また、AllocConsole()の戻り値が0以外になっているかどうか、確認する。

・その他として、プログラムを実行中コンソールが出てる状態で、左上のアイコンを右クリックすると、プロパティが選択できるので、そこから、フォント種を変更してみる

・あとは、もし、admin権限のないユーザーでログインして、作業をしているのであれば、admin権限のあるユーザーで、ログインし実行しても同じかどうかでしょうか?

自分の環境には、WSL2を入れていますが、あまりインパクトはないと思いますが、念のため

正直、他には思いつかないですね
    • good
    • 0
この回答へのお礼

ご返信ありがとうございます。

・>WriteLine()したあとに、ReadLine()で止めても、
これを試してみて発見があったのですが、
Console.ReadLine();を追加して実行します。
そしてbuttonを押すとそのままではWindowsフォームがアクティブですが
コンソールウインドウをクリックしてアクティブにして
キーを入力するとそのキーの文字が表示されます。
これはConsole.ReadLine();ない場合だと、
コンソールウインドウをアクティブにしてキーを入力しても
何も表示されないというか反応がなかったので、違いが出ました。
ここから何か分かることはあるでしょうか?
https://s.kota2.net/1683769557.jpg

・No.2のよっしーラボさんの提示された通りに実行してみましたが
やはり文字は表示されませんでした。
https://s.kota2.net/1683769262.jpg
https://s.kota2.net/1683769275.jpg

・今でもコンソールアプリケーションプロジェクトから作成したプログラムで
Console.WriteLineをすれば文字が表示されたので問題ないと思います。

・PCの再起動でも駄目でした。以前から試していたのですが一度も書き込めたことがないです。

・AllocConsole()の戻り値はTrueでした。

・コンソールのプロパティです
https://s.kota2.net/1683770004.jpg
https://s.kota2.net/1683770027.jpg
https://s.kota2.net/1683770039.jpg
https://s.kota2.net/1683770052.jpg
https://s.kota2.net/1683770063.jpg

・admin権限とかはよく分からないで、とりあえず調べておきます。

お礼日時:2023/05/11 10:55

分かったかも・・・



Textカラーがコンソールのバックグラウンドと同じ色になってませんか?

Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.White;

など、設定してみてはいかがでしょうか?

https://learn.microsoft.com/ja-jp/dotnet/api/sys …
https://learn.microsoft.com/ja-jp/dotnet/api/sys …
    • good
    • 0
この回答へのお礼

ご返信ありがとうございます。

それを追加してみたのですが、

public Form1()
{
InitializeComponent();
AllocConsole();
Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.White;
Console.WriteLine("test");
}

変わらなかったです。。
一応、ConsoleColor.YellowやConsoleColor.Greenなども設定してみたのですが駄目でした。
まあでもやはりプログラムの処理が来ているか調べるのに
WriteLineが最も分かりやすいメソッドですよね。

コンソールウインドウが表示されてマウスカーソルが点滅しているの時の
点灯しているシーンの画像です。
https://s.kota2.net/1683710740.jpg

お礼日時:2023/05/10 18:33

出来ていますね。



Windows11 Pro 22H2 22621.1635
VS Cummunity 2022(64bit) Version17.5.5
C#ツール 4.5.2-3.23171.7
.NET Framwork Version 4.8.09032

手順:
1)新規プロジェクトで、「C# Windowsフォームアプリ」→「Windows フォームアプリ」を選択し作成
2)Form.csに、「表示」→「ツールボックス」から「Button」を追加
3)ボタンのサイズを少しおきくし、ボタンを右クリック
4)「プロパティ」→「イベント」を選択し、下記コードの、「Button1_cClick」を「Click」イベントのリストボックスから選択
5)実行

結果:
フォームが立ち上がるとコンソールも立ち上がり、ボタンを押す毎に、コンソールに"test"が表示

補足:
・AllocConsole()をButton1_Clickに移動しても同じ。
・ReadLine()は文字入力待ちになるのでこのサンプルでは、入れてませんが、入れるとEnterキーを押すと、再度、Buttonがアクティブになり、押せるようになります。


Program.cs
=============================
using System;
using System.Windows.Forms;

namespace WinFormsApp1
{
public partial class Form1 : Form
{
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool AllocConsole();

public Form1()
{
InitializeComponent();
AllocConsole();
}
private void Button1_Click(object sender, EventArgs e)
{
Console.WriteLine("test");
}
}
}
=============================
「Windows Formアプリからコンソ」の回答画像2
    • good
    • 0
この回答へのお礼

ご返信ありがとうございます。

そうですか、やはりできてないのは環境がまずいんでしょうか・・・
ちなみに

public Form1()
{
InitializeComponent();
AllocConsole();
Console.WriteLine("test");
}

フォームロード時にWriteLineをもってきも、コンソールウインドウは表示されるのですが
やはり文字はでてきません。
一応、関係してるかもしれない画像を添付しました。
よろしければ参照して下さい。

https://s.kota2.net/1683706867.jpg
https://s.kota2.net/1683706875.jpg
https://s.kota2.net/1683706927.jpg
https://s.kota2.net/1683706935.jpg

エディション Windows 11 Home
バージョン 22H2
OS ビルド 22621.1702
エクスペリエンス Windows Feature Experience Pack 1000.22641.1000.0

Microsoft Visual Studio Community 2022
Version 17.5.5
VisualStudio.17.Release/17.5.5+33627.172
Microsoft .NET Framework
Version 4.8.09032

インストールされているバージョン:Community

Visual C++ 2022 00482-90000-00000-AA913
Microsoft Visual C++ 2022
C# ツール 4.5.2-3.23171.7+d17f741546fad2786cbd6394d08619544e53a36d

お礼日時:2023/05/10 17:27

これで、コンソールが出て、Test文字列が出ないのは、変ですね。



AllocConsole()をForm1()内に移動してませんか?

もし、そうだとしたら、button1_Clickが、ボタンのイベントと関連付けられてない可能性が高いですけど。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

button1_Clickのイベントはちゃんと発生していて
試しにMessageBox.Show("test");で表示されました。
https://ux.getuploader.com/dialogues_txt/downloa …

このサイトを参考にしました。
https://www.wareko.jp/blog/output-text-string-to …

ちなみによっしーラボさんの環境では表示されるのでしょうか?
また他に気になる箇所はありますでしょうか?

お礼日時:2023/05/10 11:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています