初心者です。
メインの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一眼レフカメラにオートフォーカスはないですよね?

普通のビデオカメラにオートフォーカス機能がついていますが、一眼レフカメラにはないですよなね?

Aベストアンサー

静止画のオートフォカスについては、他の方の回答をご覧ください。

従来、動画撮影ではオートフォーカスが効かないのが常識でした。
しかし、厳密にはミラーレスなので一眼レフとはいいがたいのですが、レンズ交換式でパナソニックの
LUMIX DMC-GH1(2009年発売)などで動画撮影中のオートフォーカスが実現されるようになり、
高級機では動画撮影中のオートフォカスが実現されるようになりました。

たとえば、ニコンのD300Sでは、カメラ本来のTTL位相差検出方式ではありませんが、動画撮影中はコントラストAF方式で動作させるようになりました。
http://www.nikon-image.com/products/camera/slr/digital/d300s/features03.htm
またソニーのα55は、透過ミラーで動画撮影中のオートフォーカスを実現しています。
http://www.sony.jp/CorporateCruise/Press/201008/10-0824/

QForm_LoadでDB接続ではなく、Form_Load完了でDB接続したい

VB.NETです。

現在、Form_LoadにDB接続のコードを記述していますが、Form_Load完了後に、DB接続の命令を実行することはできますでしょうか?
つまり、Form_Loadが完了したら、DB接続のコードが実行されるようにしたいのです。

理由は、DB接続に時間がかかる場合、Form_Loadによる画面がなかなか出てこない。
また、DB接続エラーとなった場合、Form_Loadによる画面が出る前に、エラーメッセージがポップアップされてしまう。
これらを回避したいのです。

良い方法ご存知の方がいましたら、ご教授下さいませ。
よろしくお願い致します。

Aベストアンサー

こんにちは、じゃんぬねっと です。

Activate イベントは、TopMost にしていると、
FormLoad イベントより先に発生することがあり、お勧めできません。
フラグも必要になりますし。

> DB接続に時間がかかる場合、Form_Loadによる画面がなかなか出てこない。

非同期に実行しては如何でしょう? スレッドを使用するとか。
また、別の画面を表示しておく手もあります。

Qライカカメラのオートフォーカス

ライカのMシリーズはレンズを交換できると思いますが、
これらのレンズはすべてマニュアルフォーカスなのでしょうか?
オートフォーカスのレンズは出ていませんか?
また今度発売されるデジタルカメラM8もやはりマニュアルフォーカスレンズのみなのでしょうか?

ライカに詳しい方、ご回答お願いしますm(_ _)m

Aベストアンサー

 potepotenさん こんばんは

 ライカMシリーズのカメラは、残念ながら最新のM7であってもオートフォーカスと言う便利な機能は有りません。したがってライカMシリーズに対応するレンズは全てマニュアルフォーカス用のレンズです。

 近い将来発売されるM8はデジカメと言われていますが、多分ライカの考えからしてオートフォーカスは搭載されないと思います。理由として、今まで発売された各型はM3~M7に至までそれまで発売されたバルナックライカ用のLマウントレンズを含めて全て同じ環境で使える環境を整えているのが特長だからです。もしM8がオートフォーカスを採用したとしたら、フランジバックを長くして、中間に現行のM型叉はL型のレンズに対応したオートフォーカス対応のマウントアダプターを作ると思います。そんな事をしたらM5以外のM型ライカの形状を変える事になってしまいます。そう言うことは多分ライカはしないと思いますから、M8もMFのカメラで作られると思います。

Q他のアプリからVBのFormへフォーカスを戻したい。

「他のアプリケーションにフォーカスがある場合に、
ショートカットキー(例:Ctrl+a)を押すと、
VBのFormへフォーカスが移る」ということをVBでプログラムしたいのですが、APIを使うのでしょうか?
VBのイベントなどを使用したプログラミングの経験はあるのですが、APIの使い方は分かりません。
どなたか教えてください。よろしくおねがいします。

Aベストアンサー

どこまでご存じか分からないので基本的なことからいいますと
windowsのアプリケーションにはOSがアプリケーションを管理するため
ハンドルというものが割り振られています。
ハンドルの取得はAPIで可能として、
問題は他のアプリケーションにフォーカスがあるときに
Ctrl+aを押したときにどういう処理をするかです。
通常押したCtrl+aはそのフォーカスがある場所つまり
アクティブ状態のアプリに渡ってしまうのですが、これを横取りする方法として
サブクラス化という方法があります。
VBのプログラムを常時バックグラウンドで起動しておいて、
Ctrl+aが押されたかどうかを監視し横取りすることにより可能かと思います。

現在起動中のアプリを列挙するにはProcess32Next()APIだったかで
いけたかと思います。
何にしても先は長い話でまずはAPIの使い方についてネットなり調べてみてはいかがでしょうか?
参考までに http://www.vbvbvb.com/
サンプルが置いてあるのでわかりやすいかと思います。

Qフィルムカメラの種類やオートフォーカス機能などについて教えて下さい

事情があってカメラの機能についていろいろ調べています。

●フィルムカメラのピントの合わせ方としては…
1.一眼レフカメラのようにレンズを回しながらピントをあわせる
2.所謂バカチョンカメラ。オートフォーカスであわせる
3・使い捨てカメラのように半押しも必要なし

この三種類しかないのでしょうか?

●それと、オートフォーカスというのは「半押し→撮影」のことを指すのでしょうか?

●デジカメには
aコンパクトカメラ
b本格的な写真を撮るための機能がついた一眼レフカメラに近いコンパクトカメラ
c一眼レフ
……の三種が主に家電店で販売されていますが、bのようなポジションのフィルムカメラってあったんでしょうか?

どれか一つでも、または分かる範囲でも構いませんのでどなたか教えて下さいませんでしょうかm(--)m

Aベストアンサー

ピント合わせ:
・離れた位置に有る鏡をファインダーから見える絵と重ね合わせてズレが最小になった時にピントが合った事にする物や
・赤外線や超音波をカメラから物体に発射して距離を測定して、その分のレンズを動かしてピントを合わせる物や
・入ってきた光の量を計算して(量が最大になった時がピントが合った時なので)その時にレンズを動かすのを止める機構を持った物や、
他にも沢山ピント合わせの機構はあります。

超音波や赤外線なんて真っ暗でもピント合わせできるのですごかったんですけどねぇ(でも真っ暗だと写らない(^^;)

●それと、オートフォーカスというのは「半押し→撮影」のことを指すのでしょうか?
 オートフォーカスは、カメラがピント合わせの操作をしてくれる方法です、半押し→撮影は、写真を撮る時の手順の一つです。
 半押ししても何もしないカメラがありますので。

レンズが交換できない一眼レフカメラというのがありましたし、マニュアルフォーカスのコンパクトカメラや、シャッタースピードや絞りを自分で調節できるコンパクトカメラは多々あります。

バカチョンの言いまわしはコンパクトカメラになりました。

ピント合わせ:
・離れた位置に有る鏡をファインダーから見える絵と重ね合わせてズレが最小になった時にピントが合った事にする物や
・赤外線や超音波をカメラから物体に発射して距離を測定して、その分のレンズを動かしてピントを合わせる物や
・入ってきた光の量を計算して(量が最大になった時がピントが合った時なので)その時にレンズを動かすのを止める機構を持った物や、
他にも沢山ピント合わせの機構はあります。

超音波や赤外線なんて真っ暗でもピント合わせできるのですごかったんですけどねぇ...続きを読む

QForm_Load内でファイルを開こうとするとエラーもでずにアプリケーションが終了?

とうとう、.netでの開発を迫られて悪戦苦闘中です・・・

VB6とはあまりにも違いすぎてもうお手上げ状態です。
フォームにコンボボックスがあり、フォームをロードしたときに外部ファイルからコンボボックスの内容を読み出してアイテムに追加しようとしているのですが、Form_Loadイベントにファイルオープンを記述すると、フォームが表示されずに終了?してしまいます。なぜでしょうか。VB6では問題なく動作していたのに、まったく違う言語のように思えてなりません・・・

それから、できるだけ自己解決したいのでVB6とVB.netの違いを詳細に説明しているような書籍などがあれば教えていただきたいと思います。

ちなみに、今回のような疑問に答えてくれる書籍はいまだ見つけられていません。
現在活用中の書籍は、「ひと目でわかるVisualBasic.NET入門」、「VisualBasic.NET 逆引き大全」、「VisualBasic.NETパーフェクトマスター」などです。

Aベストアンサー

質問者さんの要求するものとはちょっと違いますが、Form1_Loadでファイルを開いて読み込んでテキストボックスに内容を表示する方法をやりましたが普通にできました。
==============================================================
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim fs As FileStream
Dim sr As StreamReader

fs = New FileStream("test.txt", FileMode.Open)
sr = New StreamReader(fs)

TextBox1.Text = sr.ReadLine

sr.Close()
fs.Close()

End Sub
===============================================================

質問者さんの要求するものとはちょっと違いますが、Form1_Loadでファイルを開いて読み込んでテキストボックスに内容を表示する方法をやりましたが普通にできました。
==============================================================
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim fs As FileStream
Dim sr As StreamReader

fs = New FileStream("test.txt", FileMode.Open)
sr = New StreamReader...続きを読む

Q《ウェブカメラの映像にソフトフォーカス効果をかける方法はないでしょうか

《ウェブカメラの映像にソフトフォーカス効果をかける方法はないでしょうか》

電化製品店でウェブカメラを安価で購入しました。
Skypeで英会話のレッスンを受ける際 一部で使用の予定ですが
あまりにくっきりはっきり写るため もう少し目にやさしく見えないものかしら
と思案中です。
明度 鮮度 色合いなどいろいろ工夫しましたが
すこし凸に写る顔にはソフトフォーカスでもかけたいな、と(笑)

レンズのすぐ前にサランラップを当ててみましたが 何の変化もなし。
フィルターの役割にはならないようです。


高価なレンズなら可能なのでしょうか。
でも 高価なものを新しく買い求める余裕はありません。


名案をお待ちしています☆

Aベストアンサー

軽く油を塗ればソフトフォーカスがかかります。
(クリームなどで大丈夫でしょう)

QVB.net(2005)でFormのLoadイベント処理について質問で

VB.net(2005)でFormのLoadイベント処理について質問です


設定時刻として9:00とします。
formを起動した時刻が9時前ならまで何もせず。
9時以降になれば処理を開始する。

といったプログラムを作成しようと思います。

サンプル)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim settingtime As DateTime
'現在時刻を設定
Dim nowtime As DateTime = System.DateTime.Now.ToShortTimeString
'設定時間を9時
settingtime DateTime = DateTime.Parse("9:00").ToShortTimeString
'現在時刻が9時より後のとき
If nowtime < setting Then
        処理A
Else
'現在時刻が9時より前のとき
        9時まで処理Aをしない(9時になれば処理Aを開始)
End If
End Sub


上記のようにコーティングしましたが、
呼び出した時が9時以降なら処理Aをして以前ならElseの処理を行い抜けてしまいます。
9時になれば処理をAをしたいのです。
formを呼び出しにTimerのTickイベントで9時になれば処理Aを開始?

なにかいい案があればよろしくお願いします。

VB.net(2005)でFormのLoadイベント処理について質問です


設定時刻として9:00とします。
formを起動した時刻が9時前ならまで何もせず。
9時以降になれば処理を開始する。

といったプログラムを作成しようと思います。

サンプル)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim settingtime As DateTime
'現在時刻を設定
Dim nowtime As DateTime = System.DateTime.Now.ToShortTimeString
'設定時間を9時
settingtime DateTime = D...続きを読む

Aベストアンサー

お世話になります。
Form1 に Timer コントロールを貼り付けます。
以下のコードでどうでしょうか。

Public Class Form1

  ''' <summary>
  ''' 処理 A を実行する時間
  ''' </summary>
  ''' <remarks></remarks>
  Private m_startDatetime As DateTime = DateTime.MinValue

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    ' 処理 A を実行する時間を設定(Application 実行した日の 9 時)
    Me.m_startDatetime = New DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 9, 0, 0)
    Me.Timer1.Enabled = True
    Me.Timer1.Start()

  End Sub

  Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick

    If DateTime.Now.ToString("yyyyMMddHHmmss") >= Me.m_startDatetime.ToString("yyyyMMddHHmmss") Then
      ' 指定した時刻以降の時刻になったら

      ' Timer を止める
      Me.Timer1.Stop()
      Me.Timer1.Enabled = False

      ' 処理 A 実行
      Me.A()
    End If

  End Sub

  ' 処理 A
  Private Sub A()
    MessageBox.Show("A")
  End Sub

End Class

お世話になります。
Form1 に Timer コントロールを貼り付けます。
以下のコードでどうでしょうか。

Public Class Form1

  ''' <summary>
  ''' 処理 A を実行する時間
  ''' </summary>
  ''' <remarks></remarks>
  Private m_startDatetime As DateTime = DateTime.MinValue

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    ' 処理 A を実行する時間を設定(Application 実行した日の 9 時)
    Me.m_startDatetime ...続きを読む

Q一眼レフのカメラで絞りを絞ったときのフォーカス合わせについて

一眼レフのカメラ初心者です.

CANON EFというカメラを所持しています.
絞りを手動で絞ったとき,ファインダー内が暗くなるので
フォーカスが合っているのか良く分かりません.
レンズに入ってくる光量が少なくなるので暗くなるのは分かりますが,
どうやって確認すればいいのでしょうか?
玄人の方には初歩的な事かも知れませんが,よろしくお願いします.

Aベストアンサー

> 絞りを手動で絞ったとき,ファインダー内が暗くなるので
> フォーカスが合っているのか良く分かりません.
・キヤノンEFか自動開放測光機種ですから、絞りをAマークや○マークから解除してもファインダー像は暗くなりません。

現在、そのカメラは、絞り込み実絞りモードに設定しているから暗くなるのじゃ。
つまり、、、
1・セルフタイマーレバーを右に倒れていて。
2・セルフタイマー下の絞り込み測光レバーを真ん中の「L」にセットしているからだよ。

通常の撮影時は、
1・セルフタイマーは中央。
2・セルフタイマー下の絞り込み測光レバーは右側にセットして使うのじゃ。

もしも、通常の撮影時の設定でも、ファインダーが暗くなるようだと、EFは故障していますぞ。

QForm_Load 終了後

Form_Load
 省略
End Sub
フォームが表示された後、

private sub test
 do
  省略
 loop while()
End sub
test関数内の処理(do...loop)を処理したいのですが
フォームロード関数終了(End sub)後にtest関数の処理をしたい
場合どのようにすれば、良いのでしょうか
 よろしくお願いします

Timer関数以外で対応したいと考えています

Aベストアンサー

蛇足ですが、
フォームロード時に重い処理をすると、
応答がないように見えユーザが不信に思うので~(^^;
重い処理をしてもフォームは表示するサンプルです。

空のフォームモジュールを1つ、標準モジュールを2つ用意し、
下のサンプルを貼り付けて使って下さい。
「プロジェクト」→「~のプロパティ」→「スタートアップの設定」
にSub Mainを設定するのを忘れずに。

--------------------------------------------------------------------------
フォームモジュール Form1.bas
--------------------------------------------------------------------------
Private Sub Form_Load()
Dim i As Long
putlog Format(Now, "yyyy/mm/dd hh:mm:ss") & "Form_Load start"
Do Until i = 10000000
i = i + 1
If i Mod 100000 = 0 Then
putlog Format(Now, "yyyy/mm/dd hh:mm:ss") & "Form_Load " & i
End If
Loop
putlog Format(Now, "yyyy/mm/dd hh:mm:ss") & "Form_Load ended"
End Sub
--------------------------------------------------------------------------
標準モジュール Module1.bas
--------------------------------------------------------------------------
Option Explicit

Public Sub Main()
Dim lngFromsCount As Long
putlog Format(Now, "yyyy/mm/dd hh:mm:ss") & "Main start"
lngFromsCount = VB.Forms.Count
Call Form1.Show
'フォーム1がロードするまで待ち合わせ(必要ないかも)
'Do Until VB.Forms.Count = lngFromsCount + 1: Loop
Call Module1.test(Form1)
putlog Format(Now, "yyyy/mm/dd hh:mm:ss") & "Main ended"
End Sub

Public Sub test(Optional ByRef frmCallFrom As Form)
Dim i As Long
putlog Format(Now, "yyyy/mm/dd hh:mm:ss") & "test start"
i = 0
'呼出元がフォームの場合再描画し、フォーム以外の場合再描画しない。
If Not frmCallFrom Is Nothing Then
Do Until i = 10000000
i = i + 1
If i Mod 100000 = 0 Then
putlog Format(Now, "yyyy/mm/dd hh:mm:ss") & "test " & i
Call frmCallFrom.Refresh '呼出元フォームの再描画
Call VBA.Interaction.DoEvents 'フォーム1を操作可能状態にする。
End If
Loop
Else
Do Until i = 10000000
i = i + 1
If i Mod 100000 = 0 Then
putlog Format(Now, "yyyy/mm/dd hh:mm:ss") & "test " & i
Call VBA.Interaction.DoEvents 'フォーム1を操作可能状態にする。
End If
Loop
End If
putlog Format(Now, "yyyy/mm/dd hh:mm:ss") & "test ended"
End Sub
--------------------------------------------------------------------------
標準モジュール Module2.bas
--------------------------------------------------------------------------
Option Explicit

Public Sub putlog(strState As String)
Dim intFileNumber As Integer
Const LOG_FILE_NAME = "c:\test.log"
intFileNumber = FreeFile
Open LOG_FILE_NAME For Append As #intFileNumber
Print #intFileNumber, strState
Close #intFileNumber
End Sub

蛇足ですが、
フォームロード時に重い処理をすると、
応答がないように見えユーザが不信に思うので~(^^;
重い処理をしてもフォームは表示するサンプルです。

空のフォームモジュールを1つ、標準モジュールを2つ用意し、
下のサンプルを貼り付けて使って下さい。
「プロジェクト」→「~のプロパティ」→「スタートアップの設定」
にSub Mainを設定するのを忘れずに。

--------------------------------------------------------------------------
フォームモジュール Form1.bas
-------------...続きを読む


人気Q&Aランキング

おすすめ情報