初心者です。
メインのFormのLoad時に、他のアプリケーションも起動させるプログラムを
作っています。問題は、他のアプリケーション起動時に、フォーカスが
そちらへ移ってしまうことです。そこで、メインのFormを常に前面に
表示し、フォーカスを持たせる為に、SetWindowPos関数を使おうと考えて
います。が、どのようなパラメータを与えてやればよいのか分かりません。
また、もしこれよりもよい方法があれば教えて頂きたいのです。m(_ _)m
環境:VB6SP5, Win2000Pro

A 回答 (5件)

>他アプリケーションの起動にはCreateProcess関数を使っていますが・・・。


CreateProcess関数のpStartupInfoに指定するSTARTUPINFO構造体のdwFlagsメンバにSTARTF_USESHOWWINDOWを指定すると、wShowWindowメンバの値が有効になります。
これはShowWindowやShellExecuteで指定するウィンドウのスタイルと同じ値です。
こうすれば、起動時のウィンドウのスタイルを指定できます。

ちなみにCreateProcessでアプリケーションを起動した場合、pProcessInformationで指定した構造体にプロセスとスレッドのハンドルを受け取ります。
これらが必要ない場合は、即座にハンドルを閉じましょう。
さもないと、プログラム終了時までそのハンドルが残り、これを繰り返すとパフォーマンスが低下します。
    • good
    • 0
この回答へのお礼

再度回答ありがとうございます。
>これらが必要ない場合は、即座にハンドルを閉じましょう。
CloseHandle関数で閉じるのですね?(たぶん)勉強します。
重ねて御礼申し上げます。

お礼日時:2002/01/28 11:24

無理にAPIを使わなくても、


他のアプリケーション起動時にフォーカスを持たないようにすることは可能です。
Shell 関数の第二引数を調べてみてください。
vbNormalNoFocus
というのがそれにあたると思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
他アプリケーションの起動にはCreateProcess関数を使っていますが、
そちらの引数wShowWindowでフォーカスを持たせずに起動することも
可能なことが分かりました。Shell関数を用いた方法も調べてみよう
と思います。大変参考になりました。重ねて御礼申し上げます。

お礼日時:2002/01/25 16:46

追記



"常に手前に表示" にしたとしても、どのウィンドウがアクティブになるかは変わらないでしょう。
    • good
    • 0

最前面表示は、次のソースで実現できます。


APIの定義および定数は、自分で調べてください。

Private Sub Form_Load()
'最前面表示
SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE

End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
SetWindowPos関数の最後の引数に適切な値を指定してやれば
よいのですね。でも具体的に何を指定すればよいのか分から
なかったのです。もう少し自分で調べてみます。
大変参考になりました。重ねて御礼申し上げます。

お礼日時:2002/01/25 16:50

APIのShellExecute関数の最後の引数にSW_SHOWNOACTIVATEを指定すると、起動したアプリケーションがアクティブにならずに起動しますよ。

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
他アプリケーションの起動にはCreateProcess関数を使っていますが、
そちらの引数wShowWindowでフォーカスを持たせずに起動することも
可能なことが分かりました。Shell関数を用いた方法も調べてみよう
と思います。大変参考になりました。重ねて御礼申し上げます。

お礼日時:2002/01/25 16:47

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

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

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

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

QエクセルVBAのフォームを最前面にする方法を教えてください。

エクセルVBAなのですが、UserForm1を最前面に表示して、
他のどのウインドウをアクティブにしても消えない状態にしたいのですが、
どのようなコードを書けばできるでしょうか。
VB.NETで表すとMe.TopMost = Trueとなると思うのですが、
エクセルVBAだとそのような書き方はないようです。

もうしわけございませんがご教示頂きたく、お願いいたします。m(__)m

Aベストアンサー

あらかじめ、フォームのプロパティの[ShowModal]をFalseにしておいて、以下のような方法ではダメでしょうか?
画面のアクティブイベントを利用するのは、個人的に嫌いなのですが。。。


Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const HWND_TOPMOST As Long = -1
Private Const SWP_NOSIZE As Long = &H1&
Private Const SWP_NOMOVE As Long = &H2&


Private Sub UserForm_Activate()
Call SetWindowPos(GetForegroundWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Sub

あらかじめ、フォームのプロパティの[ShowModal]をFalseにしておいて、以下のような方法ではダメでしょうか?
画面のアクティブイベントを利用するのは、個人的に嫌いなのですが。。。


Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const HWND_TOPMOS...続きを読む

QVBAで任意のウインドウのサイズを変更する方法

Excel VBAを使ってIEなどのプログラムのクライアント領域の
ウインドウのサイズを指定・変更したいと考えています。

http://www.excel-vba.net/excel-api-020.html

このページのコードを使ってサイズの取得だけはできるようになりました。

次に設定を行いたいのですが

http://home.att.ne.jp/zeta/gen/excel/c04p58.htm

このページにあるように


Dim window1 As Window
Set window1 = Windows("Google - Internet Explorer") 'アプリケーションウィンドウを対象
window1.WindowState = xlNormal '通常表示に設定します。
window1.Width = 800 'ウィンドウ幅を800に設定
window1.Height = 300 'ウィンドウの高さを300に設定



とやってみましたが
インデックスが有効範囲にありません
というエラーが出てしまいます。

どうすれば良いでしょうか?

あと気になっているのですが
幅及び高さの単位はポイントです。(ピクセルでは無いので注意して下さい)。
と書かれてありますが、
ピクセルからポイントへはどのように換算すれば良いのでしょうか?

Excel VBAを使ってIEなどのプログラムのクライアント領域の
ウインドウのサイズを指定・変更したいと考えています。

http://www.excel-vba.net/excel-api-020.html

このページのコードを使ってサイズの取得だけはできるようになりました。

次に設定を行いたいのですが

http://home.att.ne.jp/zeta/gen/excel/c04p58.htm

このページにあるように


Dim window1 As Window
Set window1 = Windows("Google - Internet Explorer") 'アプリケーションウィンドウを対象
...続きを読む

Aベストアンサー

2つ目のリンクの説明はExcel内のウィンドウを扱うものですから、質問の件の参考にはなりません。
1つ目のリンクの例のように、WindowsAPIを呼び出す必要あります。
WindowsAPIはC言語の関数の体裁をしていますので、理解するには若干のC言語の知識が必要です。

ウィンドウのサイズ変更は SetWindowPos 関数でできました。関数の説明はここにあります。
https://msdn.microsoft.com/ja-jp/library/cc411206.aspx

-----------------------------------------------------
Option Explicit

'ウィンドウ位置を維持する
Public Const SWP_NOMOVE = &H2&
'ウィンドウのZオーダーを維持する
Public Const SWP_NOZORDER = &H4&

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String _
) As Long

Private Declare Function SetWindowPos Lib "user32.dll" ( _
ByVal hWnd As Long, _
ByVal hWndInsetAfter As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal uFlags As Long _
) As Long

'メモ帳のウィンドウサイズを変更するサンプル
Public Sub ChangeRect()
Dim hWnd As Long
hWnd = FindWindow(vbNullString, "無題 - メモ帳")

Call SetWindowPos(hWnd, -1, -1, -1, 400, 300, SWP_NOMOVE Or SWP_NOZORDER)
End Sub

2つ目のリンクの説明はExcel内のウィンドウを扱うものですから、質問の件の参考にはなりません。
1つ目のリンクの例のように、WindowsAPIを呼び出す必要あります。
WindowsAPIはC言語の関数の体裁をしていますので、理解するには若干のC言語の知識が必要です。

ウィンドウのサイズ変更は SetWindowPos 関数でできました。関数の説明はここにあります。
https://msdn.microsoft.com/ja-jp/library/cc411206.aspx

-----------------------------------------------------
Option Explicit

'ウィンドウ位置を維...続きを読む

Q指定のWORKBOOKを前面表示する方法(エクセル:VBA)

いつもお世話になっております。
エクセルにて処理が終了した時点で、VBAを使い自動的にメールを送るマクロを組みました。しかし、ユーザーからのリクエストにより、自動送信する前にメール内容を確認したいとのことで、一度このメール内容でOKかどうか聞いてから、送信するように書き換えました。そのMsgBoxは当然エクセル上に現れるのですが、特にシングルディスプレイユーザーの場合、送信用のメールが前面に出てしまい、エクセル上に表示されたMsgBoxに気が付かない人もいますので、送信用メールが作成されたら、エクセルを前面に出してMsgBoxの指示に従わせたいのですが、どう書けばいいのか分かりません。とりあえず、私がトライしてみた文字ールは下記のとおりですが、エクセルは前面には出ません(ただし、エクセルプログラム全体が点滅?しますが)。
~前略~

With myMail
.To = "abc@xxxxx.com"
.Cc = "123@xxxxx.com"
.Subject = Filename '指定済みです
.Body = strBody '指定済みです
.display '.sendの代わりにいったんここで表示させました
End With

Windows("XYZ.xls").Activate 'このワークブックで作業をしてます。全面にはでてきません。

mymsg = MsgBox("このメール内容で送信してもよろしいですか?"~中略~,vbYesNo + vbQuestion, "送信確認")
If mymsg = 6 Then
myMail.send

~後略~

いつもお世話になっております。
エクセルにて処理が終了した時点で、VBAを使い自動的にメールを送るマクロを組みました。しかし、ユーザーからのリクエストにより、自動送信する前にメール内容を確認したいとのことで、一度このメール内容でOKかどうか聞いてから、送信するように書き換えました。そのMsgBoxは当然エクセル上に現れるのですが、特にシングルディスプレイユーザーの場合、送信用のメールが前面に出てしまい、エクセル上に表示されたMsgBoxに気が付かない人もいますので、送信用メールが作成された...続きを読む

Aベストアンサー

Windows("XYZ.xls").Activate
のところに
VBA.AppActivate Excel.Application.Caption
を追加してみてください。

QMoveWindowで位置だけ変更するには?

VB.NET でウインドウの位置だけを変更するのに、次のMoveWindowsを使用しましたが、サイズも変更されました。

  MoveWindow(hWnd, 0, 30, 0, 0, 1)

ウインドウのサイズを変えないで、位置だけを変更する指定方法をご教示して頂きたくお願い致します。

Aベストアンサー

MoveWindowではサイズの変更は避けられません。
ほかのWindowsAPIを使ってもよいなら、SetWindowPosで実現できます。

SetWindowPos
http://msdn.microsoft.com/ja-jp/library/cc411206.aspx

uFlagsにSWP_NOSZIEとSWP_NOZORDERを指定すれば、hWndInsertAfter、cx、cyは無視されます。

Q非アクティブのウィンドウを最前面に呼び出したい。

右ダブルクリックで呼び出すランチャプログラムを作成したいのですが、
システムフックをかけてWM_RBUTTONDBLCLKをアプリ側に送り,それに反応させる形でランチャのウィンドウを最前面に持ってきたいのですが上手くいきません。

フックされたメッセージが送られてきた場合の処理は以下のようになっています。

~省略
case WM_USER+100://ダブルクリックが送られてきた場合のメッセージコード

//任意文字列を別ウィンドウのリストボックスに吐く自作関数
Add("dblclk");

//以下でウィンドウを最前面に持ってくる。

//lpにクリックされた座標が入っている
SetWindowPos(hWnd , HWND_TOP,(int)LOWORD(lp),(int)HIWORD(lp), NULL,NULL,SWP_NOSIZE|SWP_SHOWWINDOW);SetForegroundWindow(hWnd);
UpdateWindow(hWnd);

break;
~省略

このコードの場合、ウィンドウの位置は変更されるのですが、最前面に来てくれません。
Add関数が呼ばれているのでフック自体は成功しているようなのですが、何かおかしな点はありますでしょうか?

右ダブルクリックで呼び出すランチャプログラムを作成したいのですが、
システムフックをかけてWM_RBUTTONDBLCLKをアプリ側に送り,それに反応させる形でランチャのウィンドウを最前面に持ってきたいのですが上手くいきません。

フックされたメッセージが送られてきた場合の処理は以下のようになっています。

~省略
case WM_USER+100://ダブルクリックが送られてきた場合のメッセージコード

//任意文字列を別ウィンドウのリストボックスに吐く自作関数
Add("dblclk");

//以下でウィンドウを最前面...続きを読む

Aベストアンサー

★気になった点を2つとアドバイスを1つします。
・1つ目は、
 『(int)LOWORD(lp)』は『(SHORT)LOWORD(lp)』にするか、『GET_X_LPARAM(lp)』にします。
 『GET_X_LPARAM(lp)』、『GET_Y_LPARAM(lp)』マクロ関数は『WindowsX.h』で定義されています。
・2つ目は、
 『SetWindowPos』関数の引数5、引数6が『NULL』ですが、ポインタではないので『0』とします。
・3つ目は、
 配置順序のハンドルを『HWND_TOP』ではなく『HWND_TOPMOST』にしてみたらどうでしょうか?

つまり:
SetForegroundWindow( hWnd ); ←先に記述
SetWindowPos( hWnd, HWND_TOPMOST, (SHORT)LOWORD(lp), (SHORT)HIWORD(lp), 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW );
UpdateWindow( hWnd );

最後に:
・マウスの右ダブルクリックでランチャーを起動させる仕様ですが、通常の右メニューが出ると
 右ダブルクリックの『WM_RBUTTONDBLCLK』がうまく表示できますか?
・『WM_RBUTTONDBLCLK』の次のタイミングの『WM_RBUTTONUP』でランチャーを表示するように
 してみたらどうなりますか?→いろいろ試してみて下さい。
・以上。おわり。

★気になった点を2つとアドバイスを1つします。
・1つ目は、
 『(int)LOWORD(lp)』は『(SHORT)LOWORD(lp)』にするか、『GET_X_LPARAM(lp)』にします。
 『GET_X_LPARAM(lp)』、『GET_Y_LPARAM(lp)』マクロ関数は『WindowsX.h』で定義されています。
・2つ目は、
 『SetWindowPos』関数の引数5、引数6が『NULL』ですが、ポインタではないので『0』とします。
・3つ目は、
 配置順序のハンドルを『HWND_TOP』ではなく『HWND_TOPMOST』にしてみたらどうでしょうか?

つまり:
SetForegroundWindo...続きを読む

QAccessの画面更新を一時的に停止する方法。

こんにちは。
Accessの画面更新を一時的に停止する方法を捜しています。
ExcelのScreenUpdatingと同様な機能です。

VBAでの更新処理時に画面がチラチラと動くのを防止したいと思っています。
(Ver:Access2000)
ご存知の方宜しくお願い致します。

Aベストアンサー

Application.Echo False '画面の描画を止める

・・・処理を実行する・・・

Application.Echo True '画面の描画を行う

Qフォームウィンドウを最前面に表示したい(ACCESS)

ACCESS VBAを使っています。
あるタイミングで、あるフォームを表示させたいのです。
OpenFormを使ってみると、確かにフォームを開くことはできたのですが、実際は既に表示されているWindowの背面に開かれているので、目で確認することはできないのです。
新しいフォームを最前面に表示するにはどのようにしたらよいのでしょうか?

Aベストアンサー

docmd.OpenForm フォーム名,,,,,acDialog
とするか
表示させたいフォームの ポップアップのプロパティを
はい に すれば 出来ると思います。

Qフォームを開くときに、コンボボックスの値を選択(アクセスVBA)

こんにちは。
アクセスVBAで、フォームを開いたとき
(フォームのOpenイベント)に、
コンボボックスの値を選択したいのですが、
どういう方法が、あるでしょうか。

理想は、
フォームのOpenないし、Loadイベント内で、
コンボ0.ItemData(2).Selected
と、書くような感じです。
(無論、Selectedは使えませんでした)。

よろしくお願いします。

Aベストアンサー

これでいいのかな?
※テキスト書きなので検証していません

If コンボ0.ListCount > 0 Then
  コンボ0.Value = コンボ0.Column(0, 2)
End If

QEXCELのVBAでのSelectとActivateの違い

VBAの初心者です。
ExcelのVBAでメッセージを表示してシートを切換えるというのを作りたいのです。
見真似で作成したのが↓です。


Dim rtn As String
rtn = MsgBox("シートを切換えますか", vbYesNo, "シートの切替")
If rtn = vbYes Then
Worksheets("送付先一覧").Activate
Range("a1").Select

Else
Exit Sub
End If

動作確認はできましたが、上記の「Activate」を「Select」に変更しても特に動作異常がありません。
そこで、疑問ですが、「Activate」と「Select」ってどうやって使い分けるのでしょうか?

Aベストアンサー

こんにちは。

通常は、シートもセルも Select でよいと思います。
選択して、扱えるようにするということだと思います。

#2さんも述べておりますが、Activate って、ひとつを選ぶことですね。でも、なぜか、Activate は、ほとんど使いません。

たぶん、Select は、選択した後に、その選択したものを、そのままオブジェクトとして確保して使えるので便利だから選ばれるのかもしれません。

Select → Selection
として使えます。

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 


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

人気Q&Aランキング