C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: コンソールアプリケーションでメッセージボックスを出すには


(過去ログ 35 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■17070 / inTopicNo.1)  コンソールアプリケーションでメッセージボックスを出すには
  
□投稿者/ ミケ (3回)-(2008/04/16(Wed) 11:55:52)

分類:[.NET 全般] 

お世話になります。
一度送信したと思ったのですが、反映されていなかったので、もし二重に投稿していたら大変すみません。
表題の件について質問させて下さい。

開発環境
OS:2000 Pro
VB.Net:2003
Office Access:2003

日中Office Accessでユーザーが作業している後ろで、コンソールファイルを動かします。
コンソールファイルは atコマンドでスケジュール登録しております。

コンソール部分の作業が終わると、終了メッセージボックスを上げたいのですが
以下の方法で挫折し続けています。
改良点や他の方法などのアドバイス、もしくは引導を渡して頂けると、大変ありがたいです。


Module Module1
    Declare Auto Sub MessageBoxW Lib "user32.dll" ( _
     ByVal hWnd As Long, _
     <MarshalAs(UnmanagedType.LPWStr)> ByVal lpText As String, _
     <MarshalAs(UnmanagedType.LPWStr)> ByVal lpCaption As String, _
     ByVal uType As Integer)

    Public Declare Function FindWindowA Lib "user32" (ByVal cnm As String, ByVal cap As String) As Long

    Sub Main()
        '<API MessageBoxW>
        MessageBoxW(0, "終わりました", "タイトルです", 0) '----■方法1

        '<API FindWinow + MessageBoxW>
        Dim hWnd As Long
        hWnd = FindWindowA(vbNullString, "Microsoft Access")
        MessageBoxW(hWnd, "終わりました", "タイトルです", 0)  '----■方法2

        '<Dos窓>
        Console.WriteLine("終了しました。閉じてください")'----■方法3

        '<WindowForm>
        Dim frm As frmMsg = New frmMsg
        frm.Show()  '----■方法4
        frm.ShowDialog()  '----■方法5
        frm = Nothing
    End Sub
End Module

■1 API MessageBoxW
 結果:何も起こりませんでした。

■2 API FindWinow + MessageBoxW
 結果:デバッガが立ち上がり、エラーメッセージが表示されます

「System.NullreferenceExceptionのハンドルされていない例外が ○○.exeで発生しました。
追加情報:オブジェクト参照がオブジェクト インスタンスに設定されていません。」
となります。hWndには17桁の数字が入っていました。

すみません、APIに無知なのですが、MessageBoxWの 
ByVal hWnd As Long(オーナーウィンドウのハンドルを指定します。0 (NULL) を指定した場合、
メッセージボックスはオーナーウィンドウを持ちません)

は、この場合、
コンソールファイルはウィンドウを持たないので、そのままメッセージを出せないが、開いている画面(Access)
のWindowの番号をFindWindowで指定すると、Accessからメッセージが上がったように見える、という理解は
間違っておりますでしょうか。

■3 DOS窓
 結果:何も起こっていないように見えます。

一瞬書き込まれているのかもしれませんが、ユーザー操作で窓を閉じる事ができる方法がありましたら
どうぞご指導お願い致します。

■4 WindowFormを作成して、Show
 結果:何も起こりません。

■5 WindowFormを作成して、ShowDialog
結果:デバッガが立ち上がり、エラーメッセージが表示されます。

System.InvalidOperationException' のハンドルされていない例外がsystem.windows.forms.dllで発生しました。
追加情報:アプリケーションが UserInteractive モードで実行されていないときに、モーダル ダイアログまたは
フォームを表示することは有効な操作ではありません。サービス アプリケーションからの通知を表示するには、
ServiceNotification または DefaultDesktopOnly スタイルを指定してください。

どうぞよろしくお願い致します。
長文失礼致しました。

引用返信 編集キー/
■17073 / inTopicNo.2)  Re[1]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ やじゅ (310回)-(2008/04/16(Wed) 13:04:06)
No17070 (ミケ さん) に返信
> MessageBoxW(0, "終わりました", "タイトルです", 0) '----■方法1

MessageBoxW(Me.hWnd , "終わりました", "タイトルです", 0) '----■方法1
ではどうでしょうか?
http://www.loadsystem.net/api/api22.htm
引用返信 編集キー/
■17077 / inTopicNo.3)  Re[2]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ ぽぴ王子 (352回)-(2008/04/16(Wed) 13:29:53)
ぽぴ王子 さんの Web サイト
No17070 (ミケ さん) に返信

APIを使わなくても

プロジェクトのプロパティを表示して
「参照」タブ
「追加」ボタンを押して「System.Windows.Forms」を参照追加
こうすることで
 System.Windows.Forms.MessageBox.Show("あーあーあーてすとてすとえムナウ28歳")
とか書けるようになると思います。

引用返信 編集キー/
■17078 / inTopicNo.4)  Re[2]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ ミケ (4回)-(2008/04/16(Wed) 13:33:01)
No17073 (やじゅ さん) に返信

ご回答ありがとうございます。
下記HP拝見しました。

> MessageBoxW(Me.hWnd , "終わりました", "タイトルです", 0) '----■方法1
> ではどうでしょうか?
> http://www.loadsystem.net/api/api22.htm

申し訳ございません、説明が不足しておりました。
Module1 の Sub Main は VB.Netのコンソールアプリケーションのコードになります。
教えて頂いた方法はAccess VBAだと思うのですが、atコマンドで動かすVB.Netのメッセージボックス
の方法を探しております。

自分が何か勘違いしておりましたら、すみませんがご指摘よろしくお願い致します。
引用返信 編集キー/
■17080 / inTopicNo.5)  Re[3]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ ミケ (6回)-(2008/04/16(Wed) 13:45:10)
No17077 (ぽぴ王子 さん) に返信

お世話になっております。
ご回答ありがとうございます。

> プロジェクトのプロパティを表示して
> 「参照」タブ
> 「追加」ボタンを押して「System.Windows.Forms」を参照追加
> こうすることで
>  System.Windows.Forms.MessageBox.Show("あーあーあーてすとてすとえムナウ28歳")
> とか書けるようになると思います。

System.Windows.Forms.dll を .Netの参照に追加し、
System.Windows.Forms.MessageBox.Show("あーあーあーてすとてすとえムナウ28歳")

を記入しますと、起動時刻にデバッガが立ち上がり
エラーメッセージ
System.InvalidOperationException' のハンドルされていない例外がsystem.windows.forms.dllで発生しました。
追加情報:アプリケーションが UserInteractive モードで実行されていないときに、モーダル ダイアログまたは
フォームを表示することは有効な操作ではありません。サービス アプリケーションからの通知を表示するには、
ServiceNotification または DefaultDesktopOnly スタイルを指定してください。

が上がりました。

何か他に注意することが必要でしょうか。

もう一つの記事のご返信ありがとうございます。
後ほどお返事させてください。


引用返信 編集キー/
■17082 / inTopicNo.6)  Re[4]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ ぽぴ王子 (353回)-(2008/04/16(Wed) 13:58:48)
ぽぴ王子 さんの Web サイト
No17080 (ミケ さん) に返信

> エラーメッセージ
> System.InvalidOperationException' のハンドルされていない例外がsystem.windows.forms.dllで発生しました。
> 追加情報:アプリケーションが UserInteractive モードで実行されていないときに、モーダル ダイアログまたは
> フォームを表示することは有効な操作ではありません。サービス アプリケーションからの通知を表示するには、
> ServiceNotification または DefaultDesktopOnly スタイルを指定してください。
>
> が上がりました。

こちらでも確認しました。
そういえば at コマンドで自動実行させてるんですよね。
えーと…とりあえず at コマンドで設定するときに /interactive スイッチをつけてみる
というのはどうでしょうか。
ええ、消極的な対応ですが。ついでにコマンドプロンプトが表示されているような気が
しないでもないですが。

逆に言うと、それ以外だと API を利用しても同じ結果になりそうな気がします。
引用返信 編集キー/
■17083 / inTopicNo.7)  Re[5]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ ミケ (8回)-(2008/04/16(Wed) 14:26:15)
No17082 (ぽぴ王子 さん) に返信

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

> えーと…とりあえず at コマンドで設定するときに /interactive スイッチをつけてみる
> というのはどうでしょうか。
> ええ、消極的な対応ですが。ついでにコマンドプロンプトが表示されているような気が
> しないでもないですが。

at 14:22 /interactive "○○.exe" /k
+
Console.WriteLine("終了しました。閉じてください")'----■方法3

を実行してみましたが、コマンドプロンプトは一瞬しか出てくれませんでした。
指定方法が間違っておりますでしょうか。。。?

> 逆に言うと、それ以外だと API を利用しても同じ結果になりそうな気がします。

すみません、最初の投稿の
>---------------------------
■2 API FindWinow + MessageBoxW
 結果:デバッガが立ち上がり、エラーメッセージが表示されます

「System.NullreferenceExceptionのハンドルされていない例外が ○○.exeで発生しました。
追加情報:オブジェクト参照がオブジェクト インスタンスに設定されていません。」
となります。hWndには17桁の数字が入っていました。

すみません、APIに無知なのですが、MessageBoxWの 
ByVal hWnd As Long(オーナーウィンドウのハンドルを指定します。0 (NULL) を指定した場合、
メッセージボックスはオーナーウィンドウを持ちません)

は、この場合、
コンソールファイルはウィンドウを持たないので、そのままメッセージを出せないが、開いている画面(Access)
のWindowの番号をFindWindowで指定すると、Accessからメッセージが上がったように見える、という理解は
間違っておりますでしょうか。
>---------------------------

で回避できるとよいなと思ったのですが、やはり無理でしょうか。
引用返信 編集キー/
■17084 / inTopicNo.8)  Re[6]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ 774RR (159回)-(2008/04/16(Wed) 14:36:00)
そもそもの前提を覆すようだけど
at コマンドで起動する→設定次第ではオペレータがいないときに起動できる→
そんなときにメッセージボックスを出しても誰も見ないし、閉じる人もいないのでリンダ困っちゃう
わけで、
****そもそもメッセージボックスを出すこと自体が仕様的に間違っている****
と俺は思うわけだが。
エラーメッセージや開始終了メッセージはログファイルに出すべきだろう。
もしくはイベントログとか。
引用返信 編集キー/
■17085 / inTopicNo.9)  Re[7]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ ミケ (9回)-(2008/04/16(Wed) 14:49:44)
No17084 (774RR さん) に返信

ご指摘ありがとうございます。

> そもそもの前提を覆すようだけど
> at コマンドで起動する→設定次第ではオペレータがいないときに起動できる→
> そんなときにメッセージボックスを出しても誰も見ないし、閉じる人もいないのでリンダ困っちゃう
> わけで、
> ****そもそもメッセージボックスを出すこと自体が仕様的に間違っている****
> と俺は思うわけだが。
> エラーメッセージや開始終了メッセージはログファイルに出すべきだろう。
> もしくはイベントログとか。

仰るとおりだと思うのですが、今回は

ユーザーが忘れてはいけない定期的な操作(at + exe)→
実行が終わったらAccessの表示結果が変わる
ここで裏で何をやったか、終わったのか、今表示結果はどの状態を表示しているのか
がユーザーにわかるようメッセージボックスを上げたいと思っております。

> そんなときにメッセージボックスを出しても誰も見ないし、閉じる人もいないのでリンダ困っちゃう
に関しては hWnd<>0 then
のような処理を入れるつもりでした。
(ログファイルも記録しております)

気にかけて頂いてありがとうございますm(_ _)m

引用返信 編集キー/
■17088 / inTopicNo.10)  Re[8]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ ぽぴ王子 (354回)-(2008/04/16(Wed) 15:24:51)
ぽぴ王子 さんの Web サイト
No17083 (ミケ さん) に返信

> at 14:22 /interactive "○○.exe" /k
> +
> Console.WriteLine("終了しました。閉じてください")'----■方法3
>
> を実行してみましたが、コマンドプロンプトは一瞬しか出てくれませんでした。
> 指定方法が間違っておりますでしょうか。。。?

これだと Console.WriteLine でコンソールに出力して、出力を待たずに
終了してしまいますよね。なので一瞬しか出なくて正解です。
MessageBox.Show を使って一旦処理を止めないといけなくて、そうすると
自動実行ではインタラクティブに表示することは無理だ!じゃあ at コマンド
に /interactive オプションをつけるしか…!
という流れだったはずです。

で、/interactive スイッチをつけなければ、メッセージボックスを表示させる
といったインタラクティブな、ユーザーの操作を必要とするような処理はできない
わけで、API を利用しても無理と書いたのはそのためです。

逆に言えば、/interactive スイッチをつければできると思います。


> コンソールファイルはウィンドウを持たないので、そのままメッセージを出せないが、開いている画面(Access)
> のWindowの番号をFindWindowで指定すると、Accessからメッセージが上がったように見える、という理解は
> 間違っておりますでしょうか。

うーん、Access からメッセージが上がったように見えるというか、Access を
親としてメッセージボックスを出したい、ということですね。
まぁなんとかできるとは思いますが、あまりお勧めはしないかなぁ。

仕様的にどうかという点では774RRさんに同意です。どちらかといえば Access
内部でなんとかすべき話のような気もするし。VBA とかで。


あとは /interactive スイッチをつけてインタラクティブに表示させるなら
コンソールアプリケーションじゃなくて、普通のウィンドウアプリケーションに
するのがいいかも、と思います。
…っとフォームを出さずに実行させるのって VB だとどうするんだっけ。
なんか調べてみたけどよくわかんなかったです。
ウィンドウアプリケーションにして、ウィンドウを出さずに動作させれば
コマンドプロンプトも表示されなくて(゚Д゚)ウマーだと思ったんだけど。
引用返信 編集キー/
■17462 / inTopicNo.11)  Re[9]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ ミケ (11回)-(2008/04/24(Thu) 23:06:04)
2008/04/24(Thu) 23:15:24 編集(投稿者)

No17088 (ぽぴ王子 さん) に返信

お返事が遅くなりまして大変すみません。

atコマンドで、メッセージボックスを上げる外部vbsファイルを呼び出すスケジュールを登録する事で、
何とか希望の形にする事ができました。

全く後の方の参考となるような解決方法ではございませんが、
こちらでご指導頂いたお陰で、理解ができた事大変感謝です。
interactiveスイッチの使い方等勉強できて嬉しいです。

ぽぴ王子様、 774RR様、やじゅ様 ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -