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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.17070 の関連記事表示

<< 0 >>
■17070  コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ ミケ -(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 スタイルを指定してください。

    どうぞよろしくお願い致します。
    長文失礼致しました。
親記事 /過去ログ35より / 関連記事表示
削除チェック/

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

    MessageBoxW(Me.hWnd , "終わりました", "タイトルです", 0) '----■方法1
    ではどうでしょうか?
    http://www.loadsystem.net/api/api22.htm
記事No.17070 のレス /過去ログ35より / 関連記事表示
削除チェック/

■17078  Re[2]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ ミケ -(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のメッセージボックス
    の方法を探しております。

    自分が何か勘違いしておりましたら、すみませんがご指摘よろしくお願い致します。
記事No.17070 のレス /過去ログ35より / 関連記事表示
削除チェック/

■17077  Re[2]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ ぽぴ王子 -(2008/04/16(Wed) 13:29:53)
>
    No17070 (ミケ さん) に返信

    APIを使わなくても

    プロジェクトのプロパティを表示して
    「参照」タブ
    「追加」ボタンを押して「System.Windows.Forms」を参照追加
    こうすることで
     System.Windows.Forms.MessageBox.Show("あーあーあーてすとてすとえムナウ28歳")
    とか書けるようになると思います。
記事No.17070 のレス /過去ログ35より / 関連記事表示
削除チェック/

■17080  Re[3]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ ミケ -(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 スタイルを指定してください。

    が上がりました。

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

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

記事No.17070 のレス /過去ログ35より / 関連記事表示
削除チェック/

■17082  Re[4]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ ぽぴ王子 -(2008/04/16(Wed) 13:58:48)
>
    No17080 (ミケ さん) に返信

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

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

    逆に言うと、それ以外だと API を利用しても同じ結果になりそうな気がします。
記事No.17070 のレス /過去ログ35より / 関連記事表示
削除チェック/

■17083  Re[5]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ ミケ -(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からメッセージが上がったように見える、という理解は
    間違っておりますでしょうか。
    >---------------------------

    で回避できるとよいなと思ったのですが、やはり無理でしょうか。
記事No.17070 のレス /過去ログ35より / 関連記事表示
削除チェック/

■17084  Re[6]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ 774RR -(2008/04/16(Wed) 14:36:00)
    そもそもの前提を覆すようだけど
    at コマンドで起動する→設定次第ではオペレータがいないときに起動できる→
    そんなときにメッセージボックスを出しても誰も見ないし、閉じる人もいないのでリンダ困っちゃう
    わけで、
    ****そもそもメッセージボックスを出すこと自体が仕様的に間違っている****
    と俺は思うわけだが。
    エラーメッセージや開始終了メッセージはログファイルに出すべきだろう。
    もしくはイベントログとか。
記事No.17070 のレス /過去ログ35より / 関連記事表示
削除チェック/

■17085  Re[7]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ ミケ -(2008/04/16(Wed) 14:49:44)
    No17084 (774RR さん) に返信

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

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

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

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

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

    気にかけて頂いてありがとうございますm(_ _)m
記事No.17070 のレス /過去ログ35より / 関連記事表示
削除チェック/

■17088  Re[8]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ ぽぴ王子 -(2008/04/16(Wed) 15:24:51)
>
    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 だとどうするんだっけ。
    なんか調べてみたけどよくわかんなかったです。
    ウィンドウアプリケーションにして、ウィンドウを出さずに動作させれば
    コマンドプロンプトも表示されなくて(゚Д゚)ウマーだと思ったんだけど。
記事No.17070 のレス /過去ログ35より / 関連記事表示
削除チェック/

■17462  Re[9]: コンソールアプリケーションでメッセージボックスを出すには
□投稿者/ ミケ -(2008/04/24(Thu) 23:06:04)
    2008/04/24(Thu) 23:15:24 編集(投稿者)

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

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

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

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

    ぽぴ王子様、 774RR様、やじゅ様 ありがとうございました。
記事No.17070 のレス / END /過去ログ35より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -