(1)メインプログラムから電卓を実行します。
 Shell("C:\WINNT\system32\CALC.EXE", 1)
(2)メインプログラムで電卓を終了させるにわ、どうすればいいのですか
 教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

(今会社なのですが、、、)サンプルありました。

奥深く眠ってました。
Microsoftの終了方法と、定数が違いますが、こちらでも終了ができます。


コメントを見たら、処理の流れがわかると思いますが、処理の流れを記します。

Shellで電卓を起動します。Shell関数は起動したアプリのプロセスIDを返します。
次に Call EnumWindows(AddressOf EnumWinProc, 0&)を実行します。
これはたった一文で、FOR文/DO~LOOP文を使用してませんが、EnumWinProc関数内を何度も実行します。実行回数はWindowsに存在するハンドルの数だけ実行されます。
そしてその関数内で電卓のプロセスと同じハンドルを探し、電卓に終了の命令を送ってます。



EnumWinProc内を詳しく説明します。
GetParentが'0'ゼロの時、未処理としています。

これは何を意味するかというと、フォームだけでなく、フォームの中に存在するボタン、リストボックス、ラベル、それぞれのコントロールにハンドルが存在します。
しかしフォームとその中のコントロールには親子の関係があります。
GetParent(子のハンドル)の時 → '0以外'の数値を返します。基本的にフォーム(親)のハンドルのを返します。
GetParent(フォームのハンドル)の時 → '0'を返します。親が存在しないためです。

電卓にも多くのボタンが存在してます。そのボタンのハンドルはチェックする必要がないのでGoto文で未処理にさせています。必要なのは電卓本体が必要で、GetParentで0を返すものが、チェックの候補となるわけです。

あとは電卓のプロセスと比較し、一致するハンドルを取得するだけです。



Option Explicit

' ウィンドウのプロセスIDとスレッドIDを取得する関数の宣言
Private Declare Function GetWindowThreadProcessId Lib "user32.dll" _
  (ByVal hwnd As Long, lpdwProcessId As Long) As Long

'親ハンドルを取得する関数の宣言
Private Declare Function GetParent Lib "user32" _
  (ByVal hwnd As Long) As Long

'ウィンドウを列挙する関数の宣言
Public Declare Function EnumWindows Lib "user32" _
  (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

'ウィンドウにメッセージ定数を送る関数の宣言
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long

Public Const WM_CLOSE = &H10

'見つかったウィンドウハンドル
Private FindWinWnd As Long
'探すべきプロセス
Private FindPrs   As Long


Sub Main()
  Dim lngSts As Long

  '初期化を行う
  FindWinWnd = 0
  FindPrs = 0

  'とりあえず電卓を起動と同時に、電卓のプロセスを得る
  FindPrs = Shell("Calc.exe")
  
  'プロセス=0のとき起動失敗
  If FindPrs = 0 Then
    MsgBox "電卓の起動失敗"
    GoTo PGMEND
  End If
  
  'Windowsに存在する全部のハンドルから、電卓のプロセスの一緒のハンドルを探す
  Call EnumWindows(AddressOf EnumWinProc, 0&)
  
  '電卓を終了します。
  If (FindWinWnd <> 0&) Then
    MsgBox "電卓が見つかりませた。終了します。"
    Call SendMessage(FindWinWnd, WM_CLOSE, 0&, 0&)
  Else
    MsgBox "電卓が見つかりませんでした。"
  End If
  
PGMEND:
End Sub

'Windowsの全ハンドルを得ることができる関数
'内部処理は、
'(1)指定のプロセスを探す
'(2)見つかったプロセスのハンドルを記憶
Public Function EnumWinProc(ByVal hwnd As Long, lParam As Long) As Boolean
  Dim lngTrd As Long 'スレッド
  Dim lngPrs As Long 'プロセス
  
  'Trueの間は、Windowsに存在するハンドルを最後まで取得しようとする
  EnumWinProc = True
  
  '子ウィンドウは未処理
  If Not (GetParent(ByVal hwnd) = 0) Then GoTo PGMEND
  
  'スレッドとプロセスを取得する
  lngTrd = GetWindowThreadProcessId(hwnd, lngPrs)
  
  '同じプロセスだとしたら
  If lngPrs = FindPrs Then
    '取得してきたハンドルを記憶
    FindWinWnd = hwnd
    'これ以上のハンドルは取得しないでもいいので、Falseをセット
    EnumWinProc = False
  End If
  
PGMEND:
End Function
    • good
    • 1
この回答へのお礼

ありがとうございました、いちどためさしていただきます。
また何かありましたらよろしくお願いします。

お礼日時:2001/10/25 23:19

あっSendMessageの回答がでましたね。



で注意して欲しいのは、FindWindowを使う点です。
これはWindowのCaption、もしくはクラス名でWindowを探す点です。
クラス名は[CTRL]+[ALT]+[DEL]で起動中のアプリのクラス名の一覧が出てきます。
あれから参考にしてみてください。

電卓は複数起動が可能です。
Microsoftのサンプルでは、すでに電卓を起動してあったとき、先に起動してあったほうを終了させるおそれがあります。
よってFindWindowだけでWindowを探すには注意が必要です。
(それでもSendkeysよりは、かなりいいと思います。)

もし自分で作成したソフトをShellで起動するなら、このままでも大丈夫かもしれませんが、そうでなければShellで起動した時のプロセスIDを取得して、起動中のアプリ達のプロセスIDと比較し、自分の起動したEXEかをチェックする必要があるのです。

今までのサンプルで大丈夫ならいいのですが、帰ってから締め切ってなかったら、またあとで書き込みます。

ちなみに書き込もうとしてるサンプルはVB6限定です。
    • good
    • 0
この回答へのお礼

ありがとうございました、いちどためさしていただきます。
また何かありましたらよろしくお願いします。

お礼日時:2001/10/25 23:19

API関数を使うなら...



参考URL:http://www.microsoft.com/JAPAN/support/kb/articl …
    • good
    • 0

Sendkeys は一番手っ取り早いです。


確かにHELPにも出ています。

しかし、どのVBのメーリングリストもSendkeysは使用しない方向でやっております。
それはWindowsにかかっている負荷の状況により、Sendkeysの処理が必ずしも一致するわけではないからです。
以前にサンプルを作ったのですが、どうやら自宅においたままになっているようなので、またあとで書き込みます。
キーワードはSendMessageです。
    • good
    • 0

SendKeyで終了のキー操作情報を送信してやります。



たしかHELPのサンプルが電卓を終了させるものだったと記憶しています。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q今度10数名の研修が終了しますが、終了後の意見交換などのコミュニティの

今度10数名の研修が終了しますが、終了後の意見交換などのコミュニティの場を、ネット上に設けたいと考えております。それには(SNS やブログ)などが考えられると思いますが、このようなコミュニティの形成にはどちらが向いているのでしょうか?
私も普通のブログは経験があるのですが、詳しいことは分かりません。またSNSはやったことがありません。皆さまのご意見をお聞かせいただければと存じます。

(SNS やブログ)にもいろいろあるようですが、どこか適当なサービスがご存知でしたら教えていただけますでしょうか。よろしくお願いいたします。

Aベストアンサー

ブログの場合、アカウントを持っている人しか記事が書けないので、そこに他の人がコメントを付ける形になります。別の人もブログのアカウントを作ればそこでまたコメントを付ければ良いのですが、それぞれが別のブログを持つことになります。全員のブログをチェックしないと誰が何を記事にしたか判らないのと、横断的なコミュニケーションが難しいと思います。

SNSの場合、横の繋がりを登録しますので、誰かが記事(日記)を書くと判るようになっています。個人情報がグループ化された人全員に見えてしまうので、選定したSNSを既に個人で利用している人は困惑するかもしれません。他の利用者からグループの存在は見えるようになっています。

So-netがグループ向けに閉じられたSNSを作れるサービスをしていましたが、現在はサービス終了がアナウンスされています。もしかしたら他に同等の物があるかも知れません。

参考URL:http://www.so-netsns.jp/

QShellで起動したプログラムのウィンドウ表示位置

vbからshellを使って、cで書いた実行ファイルを起動しています。

その起動した実行ファイルの表示位置を指定したいのですが、どうしたらよいのかわかりません。
もしかしてshellでは無理なのでしょうか?

それともcのコードに変更を加えるべきなのでしょうか?
cの方はOpenCVで、ウィンドウ生成が「cvNamedWindow(windowName名前)」で行っているので、
これもどう位置を指定したらよいのかわかりません。。。

どなたかわかる方よろしくお願いします。

Aベストアンサー

お礼率 14% が気になりますのでヒントだけ。
ウィンドウのハンドルを取得して、そのハンドルを使って、SetWindowPos API で位置と
サイズを指定して下さい。

# 回答には一言お礼を言いましょう。

QSo-netSNSの代わりになりうるサービス(ML付き希望)

So-netのSNSレンタルサービスが終了することになってしまいましたが、代わりになりうる無料サービスを探しています。
無料のSNSレンタルは探せば色々あるのですが、出来れば、So-netSNS同様、コミュニティにML機能が付属している所が希望なのですが、どこかにないでしょうか。

Aベストアンサー

コメントありがとうございます。
それで、そ~しゃるぱ~くはお眼鏡にかなわなかったと?

逆にFreeMLは以前、MLとして使ったことはありますが、コミュニティ機能としてどれくらい要望を満たすのか不明。

参考URL:http://www.freeml.com/

Qファイルを探すプログラムで c:\のみ動かない

ファイルを探すプログラムをネット頂き テストしたのですが
c:\ のみ 動かず c:\*** は そのフォルダーから下を探します
e:\ は 全てのフォルダーを探します。
WIN8 ですが どこで間違ってるのでしょうか?
よろしくどうぞ

Option Explicit
Private g_dteDate As Date
Private g_strEXT As String

'参照設定 M-Scripting.Runtime

Cells(1, 2).Value に 探すアドレス 記載 c:\  e:\  c:\*** など

Sub Sample_FileSearch2()

  Dim vntF As Variant
Dim objFSO As FileSystemObject
Dim dteDate As Date
Dim GYO As Long
Dim cntFound As Long

Set objFSO = New FileSystemObject ' FSO
Rows("5:65536").ClearContents
GYO = 4
’ g_dteDate = DateAdd("m", Cells(3, 2).Value * -1, Date) 更新 不要
g_strEXT = UCase(Trim(Cells(2, 2).Value))

' ルートフォルダから探索開始
Call Sample_FileSearch2_SUB(objFSO, _
objFSO.GetFolder(Trim(Cells(1, 2).Value)), GYO, cntFound)
Set objFSO = Nothing
' 処理結果の表示
If cntFound = 0 Then
MsgBox "見つかりません"
Else
MsgBox cntFound & "個見つかりました"
End If
End Sub

'''*******************************************************************************
''' ファイル探索処理(再帰動作)
'''*******************************************************************************
Private Sub Sample_FileSearch2_SUB(objFSO As FileSystemObject, _
ByVal objFolder As Folder, _
GYO As Long, cntFound As Long)
Dim objFolder2 As Folder
Dim objFile As File

' サブフォルダの探索
For Each objFolder2 In objFolder.SubFolders
' サブフォルダ個々の探索(再帰動作)
Call Sample_FileSearch2_SUB(objFSO, objFolder2, GYO, cntFound)

Next objFolder2

' このフォルダ内のファイルの探索
For Each objFile In objFolder.Files
' ここから条件判断
With objFile
If (UCase(objFSO.GetBaseName(.Path)) = g_strEXT) Then

GYO = GYO + 1
Cells(GYO, 1).Value = .Name
Cells(GYO, 2).Value = .DateLastModified
Cells(GYO, 3).Value = _
Left(.Path, Len(.Path) - Len(.Name) - 1)
cntFound = cntFound + 1
End If
End With
Next objFile

End Sub

ファイルを探すプログラムをネット頂き テストしたのですが
c:\ のみ 動かず c:\*** は そのフォルダーから下を探します
e:\ は 全てのフォルダーを探します。
WIN8 ですが どこで間違ってるのでしょうか?
よろしくどうぞ

Option Explicit
Private g_dteDate As Date
Private g_strEXT As String

'参照設定 M-Scripting.Runtime

Cells(1, 2).Value に 探すアドレス 記載 c:\  e:\  c:\*** など

Sub Sample_FileSearch2()

  Dim vntF As Variant
Dim objFSO As FileSystemObject
...続きを読む

Aベストアンサー

該当フォルダの参照権を持つアカウントの
ユーザとパスワードが分かっていれば可能です。
特定の利用者にしか権限を与えないフォルダに
システム情報を記録して、一般ユーザから保護
するという仕組みはよく見られる手法です。

LogonUserで権限ユーザのトーケンを取得し、
ImpersonateLoggedOnUseで偽装します。偽装中は
フォルダを参照できます。
その後、RevertToSelfで偽装を終わり、処理後、
CloseHandleでトーケンを閉じます。
以下、サンプルです。

Const LOGON32_LOGON_INTERACTIVE As Long = 2
Const LOGON32_PROVIDER_DEFAULT As Long = 0
Declare Function LogonUser Lib "Advapi32" Alias "LogonUserA" _
    (ByVal ユーザ As String, _
     ByVal ドメイン As String, _
     ByVal パスワード As String, _
     ByVal タイプ As Long, _
     ByVal プロバイダ As Long, _
     ByRef トーケン As Long) As Long
Declare Function ImpersonateLoggedOnUser Lib "Advapi32" _
    (ByVal トーケン As Long) As Long
Declare Function RevertToSelf Lib "Advapi32" () As Long
Declare Function CloseHandle Lib "kernel32" _
    (ByVal ハンドル As Long) As Long

Sub サンプル()
Dim トーケン As Long
Dim 処理結果 As Long

'★トーケン取得
処理結果 = LogonUser("uuuu", ".", "pppp" _
         , LOGON32_LOGON_INTERACTIVE _
         , LOGON32_PROVIDER_DEFAULT _
         , トーケン)
If 処理結果 = 0 Then
    MsgBox "ログオンできない"
    Exit Sub
End If
'★偽装開始
ImpersonateLoggedOnUser トーケン
'==
'= ここで該当フォルダの処理を行う
'==
'★偽装終了
RevertToSelf
'★トーケン解放
CloseHandle トーケン
End Sub

※上記はローカルアカウントのuuuu/ppppの例です。

但し、フォルダ毎に権限者が誰か調べたりする
必要があります。尚、権限が設定されていないと、
Administratorでも何も出来ません。
これも調べる方法、破る方法はあるんですが、さすがに
セキュリティに関することなので、一般公開できません。

ここまでするよりはエラーハンドリングで逃げたほうが
マシかも知れませんね。

該当フォルダの参照権を持つアカウントの
ユーザとパスワードが分かっていれば可能です。
特定の利用者にしか権限を与えないフォルダに
システム情報を記録して、一般ユーザから保護
するという仕組みはよく見られる手法です。

LogonUserで権限ユーザのトーケンを取得し、
ImpersonateLoggedOnUseで偽装します。偽装中は
フォルダを参照できます。
その後、RevertToSelfで偽装を終わり、処理後、
CloseHandleでトーケンを閉じます。
以下、サンプルです。

Const LOGON32_LOGON_INTERACTIVE As Long = 2
Const LO...続きを読む

Qどんな趣味の人も楽しめる無料SNSを教えて下さい

Yahoo Daysもgooホームも終了が決定し、友達といっしょに引越しできる似たような感じのSNSを探しています。

友達の要望でmixi facebook twitter、GREE以外のところでお願いします。

条件は

(1) 無料であること
(2) ゲーム系、子育て系など何かに特化したところではないこと。
  (雑談が楽しみたいのです)
(3) ひとことに対するコメントが一覧になって見られること
(4) 本名を表示名にしなくていいこと

どうぞよろしくお願いします!

Aベストアンサー

Googleのバズではダメかな?

QAccess2000vbaで、shell関数で起動させたExcellを終了する方法を教えてください。

Access2000vbaで、shell関数で起動させたExcellを終了する方法を教えてください。
以下のように、shell関数で、既存のExcelファイルを起動させました。
どうすれば、Excelファイルを終了できますか?
宜しくお願いします。

Dim fl_name As String

fl_name = "C:\XE2.xls"
Shell "C:\Program Files\Microsoft Office\Office\EXCEL.EXE " & fl_name, vbNormalFocus

Aベストアンサー

こんばんは。

Shell であけるのに、閉めるほうが、これじゃあ、かなりヘンですが、まあ、こんな方法があるという程度にしてください。本来は、開けるほうは、CreateObejct にするなりしたほうがよいのですが。

Private Const fl_name As String = "testa.xls"

Private Sub コマンド_Click()
Dim xlApp As Object
 On Error Resume Next
 Set xlApp = GetObject(, "Excel.Application")
 If Not xlApp Is Nothing Then
  'もし保存するなら……
  If xlApp.Workbooks(fl_name).Saved = False Then
  xlApp.Workbooks(fl_name).Save
 End If
  xlApp.Quit
 End If
End Sub

Qジャンル特化型のSNSを立ち上げたい

ミクシィとかグリーのようなオールラウンドなSNSではなくて、あるジャンルに特化したSNSを立ち上げたいと考えています。

特化型のSNSでうまく行きそうなジャンルや、上手く行っているSNSがあれば教えてください。

Aベストアンサー

ただSNSを構築するだけなら簡単ですが、ミクシィやGREEとの違いを鮮明にしないと、集客が厳しくなります。

ミクシィのような大手SNSのコミュニティでは加入しづらいジャンルを狙うといいのではないでしょうか。

ゲイのSNS
http://gaycom.jp/xc/menu/top

キャバクラのSNS
http://cabanet.jp/

とか、ですね。

参考URL:http://gaycom.jp/xc/menu/top,http://cabanet.jp/

Qshell関数について

毎度、お世話になっています。

現在、C言語で書いた複数のプログラムをBATファイルで処理するように記述しています。VBでその制御を行っているのですが、VBの処理手順として子フォーム(textあり)にデータを書きこんで、ボタンを押すとshellでbatファイルを起動し、バッチファイルの結果として、あるディレクトリにresult.txtが作成され、VBで他の子フォームに読みとらせようとしているのですが、shellだと、実行の終了を待たずに次にいってしまうので、そのバッチファイルの実行処理が終わらず、result.txtの内容を読み込むことができません。
待つようにするにはどうすればよいのでしょうか?
ちなみにVBは一週間前にはじめて、自分でも調べてなんとか作ろうとしたのですが、時間がないため、ここに質問させていただきました。なるべく簡単なアルゴリズムで、よろしくお願いします。


VBのプロセス
  
テキストにデータを書き込む
     ↓
    ボタン   →        テキストの内容を*.txtとして保存
                       ↓
                     バッチファイル起動
   ↓(ここで右の実行を待たない     ↓
    ので読み込むことができない)   C言語で書かれたプログラム実行
                       ↓
result.txtを    ←        結果としてresult.txtが出来上がる
読み込んで表示

    

毎度、お世話になっています。

現在、C言語で書いた複数のプログラムをBATファイルで処理するように記述しています。VBでその制御を行っているのですが、VBの処理手順として子フォーム(textあり)にデータを書きこんで、ボタンを押すとshellでbatファイルを起動し、バッチファイルの結果として、あるディレクトリにresult.txtが作成され、VBで他の子フォームに読みとらせようとしているのですが、shellだと、実行の終了を待たずに次にいってしまうので、そのバッチファイルの実行処理が終わらず、result.txtの内...続きを読む

Aベストアンサー

あと、拡張エラー情報を取得してどのようなエラーか確認をしてみてください。

APIのヘルプではGetLastError()を使用してと記述されていますが、VBでは、Err.LastDllErrorで取得できます(というか、これで取得しないと違うエラー値が返される可能性があります)

http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_waitforsingleobject.htm
http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_createprocess.htm

参考URL:http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_waitforsingleobject.htm

Q「教えて!goo」はSNSですか?

WindowsOSとは関係ないのですが
SNS(ソーシャル・ネットワーキング・サービス)という言葉をよく見かけます。
ミクシイがその代表的なものとして常に紹介されています。
私はミクシイ会員ではないので、実感としてSNSのことが解りませんが
「教えて!goo」は次のどれに該当するものなのでしょうか?
1. まさにSNSである。(SNSそのものである)
2. SNSとも言える。(広義のSNSである)
3. SNSとは言えない。(SNSという分類には入らない)
4. 一般の掲示板である。
以上です。

Aベストアンサー

3.ですかね。

掲示板と勘違いしている方、結構いるんですよね……
会員間の歓談の場と勘違いしているような質問をたまに見かけますね。

ソーシャル・ネットワーキング・サービス - wikipedia
http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%AB%E3%83%BB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AD%E3%83%B3%E3%82%B0%E3%83%BB%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9
参考にどうぞ。

QShell.ApplicationのNameSpaceを書き換えたい

こんばんは、みなさん。

少し前に以下の質問でプログラムを作っていただいたのですが、
WindowsXPだとうまく動くのに、Windows2000だとうまく動作しません。

http://question.woman.excite.co.jp/kotaeru.php3?qid=2006207

具体的には、「ZIP作成メイン」【CreateZIP(p_strZipName, p_colParams)】関数の以下の部分で、
オブジェクト実行エラーで引数の指定が間違っているとか何かのエラーが表示されました。

'書庫オブジェクトを取得する
Set l_objZIP = m_objShell.NameSpace(CStr(p_strZipName))

XPではうまく動いているので、おそらくはVBScriptのインタプリタ側に
何らかの違いがあるようです。
この構文の代わりに有効なコードを書きたいと思います。

よろしくお願いします。

Aベストアンサー

どうも10500YEN(←よく見てね)です。

>ZIPに関連しない部分だけ抜き出したサンプルでも
>Set l_objZIP = m_objShell.NameSpace(CStr(p_strZipName))
いいえ、ここがそのOSでZIPを扱えるかどうかの、一番の要です。


WIN2000環境で
(1)ZIPFLDR.DLLをレジストリ登録しましたか?
(2)それによって、エクスプローラで書庫ファイルの一覧が表示できるようになりましたか?

それができなければ、ネームスペースとしてのオブジェクトを取得は無理です。
2000環境を潰したので、私のところでの実験はできません。
以前、#5にて発言した内容について、onoohnoさんがどのような対応をしたのでしょうか?

それがわかると、無理かどうかもはっきり発言できるのですが、
今の段階では、まずは#5の発言で示した内容を行動してみてくださいとしか
言えません。。。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報