• 締切済み

OCX (ACTIVEX)で非表示にするとハンドルが取れない

MSVC++(MFC)を使用して、OCXモジュールを開発しています。 VBデザイン時に Visibleプロパティがtrueの場合でも 実行時には非表示になるようしたいと思っています。 非表示にするために、「コントロールの型情報の制御」のところで、 ******に OLEMISC_INVISIBLEATRUNTIME を追加すると、 実行時に非表示になり、要件は満たすのですが、 この場合、GetSafeHwnd()の返却値がNULLとなってしまい、 イベント発生時のPostMessage()が出来なくなってしまいます。 OCXを非表示にでき、PostMessage()が成功するようにするには どのようにしたら良いかをご存知でしたら教えてください。 なお、WINDOWS 95からXPまで全ての環境での動作を考えています。

みんなの回答

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>OCX内部でスレッドを動かして、PostMessageによりメインのコントロールに通知しています。 PostThreadMessageで問題ないような。 で、OnWindowlessMessageで処理すればいいかと。

0xc0ffee
質問者

補足

結局、以下の形で解決しました。 if ( !AmbientUserMode() ){ // OCXの表示 }else{ pdc->FillRect( rcBounds, &CBrush(TranslateColor( AmbientBackColor() )) ); }

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>イベント発生時のPostMessage()が出来なくなってしまいます。 どこからどこに対してPostMessageしたいのでしょう? 非表示のコントロールに対してメッセージを投げる理由が分からないのですが。 コンテナとのやり取りは、イベントとメソッド、プロパティで十分なはずですが。

0xc0ffee
質問者

補足

OCX内部でスレッドを動かして、PostMessageによりメインのコントロールに通知しています。 つまり、OCX内部のスレッド=>メインスレッドへのPostMessageです。

関連するQ&A

  • VB(6.0)で作成したActiveX(ocx)をVBで呼び出す方法

    普通OCXを使用する時は、 デザイン時にフォームにOCXを貼り付け 実行するとそのOCXが表示されると思うのですが 今回の質問はそうではなく デザイン時には何も貼り付けず VC++で言うCreateObjectの様に 実行時にOCXのオブジェクトを生成する事が 出来るのでしょうか?

  • VBで他のツール(エクセルなど)を表示する方法

    マシンをログオフした状態でエクセルを表示(VisibleをTrue)にすることは可能でしょうか? 現状、作成したプログラムではVisibleをTrueにして エクセルを立ち上げても、Falseになっています。 尚、VBで作成したEXEはタスクにより実行されます。

  • MCI32.ocxがあるのにMCI32.ocxが無い・・・?

    MCI32.ocxがあるのにMCI32.ocxが無い・・・? とあるVisualBesic6.0にて製作されたフリーソフトを使っているのですが管理者としてプログラムを実行すると何故かMCI32.ocxがあるにも関わらず 『コンポーネント'MCI32.ocx'が適切に登録されていません。ファイルが存在しないかあるいは不正です』 とエラー文が出てきて強制終了してしまいます。 管理者としてではなく普通に起動したらそのエラーは出ないのですが今度は他のファイルから読み込む時に 『実行時エラー'75' パス名が無効です。』 と出てきてしまいます。 この場合どうすれば良いのでしょうか……? OSはvistaです

  • OCXのライセンス

    Visual Basic 6.0 で、他人の作成したユーザOCXを使用しようとしているのですが、「実行時エラー429:このコンポーネントのライセンスが見つかりません。デザイン環境でこの機能を使うために必要なライセンスがありません。」と、エラーが表示されます。 現在、プロジェクトファイルのあるディレクトリに、OCXとLICファイルをおいているのですが…。 OCXの登録はされているはずなのですが、念のための登録確認方法と、ライセンス登録のための手順を教えていただけないでしょうか?

  • デザイン時のVisible=Falseは実行時に変更できない?

    VB2008です。 フォームデザイン時に、コントロールのVisibleをFalseに設定していると、実行時にTrueに設定してもコントロールが見えません。(実行時エラーも出ません。) 私の環境では、ほぼすべてのコントロールが同じ挙動をします。 もちろん、デザイン時にVisibleをTrueにしておいて、実行時にコードでFalseにすると見えなくなりますし、Trueを与えてやると再度見えるようになります。 これは、言語の仕様なのでしょうか。

  • tabctl32.ocxでつまづいてます。

    初心者です。 あるものをダウンロードし解凍してインストールまで出来たのですが、いざ開こうとすると 実行時エラー ’339’ コンポーネント'TABCTL32.OCX' 、またはその依存関係のひとつが適切に登録されていません。ファイルが存在しないか、あるいは不正です。 と出てしまい困っています。 しかし一部だけ開ける状態で他は同じくエラー表示がでます。 自分で調べてみたんですがいまいちわかりません。 どなたか分かりやすく教えて頂きませんか? お願いします。

  • OCX内のコントロール名の取得方法

    VB6で下記の記述で実行しようと思ったのですが OCX内のコントロール名を取得できませんでした。 Dim strBtnName as String Dim objBtnName as Object For Each objBtnName In me.controls if me.Name = strBtnName then objBtnName.Enable = True End If Next objBtnName コントロール名を取得できない時は 文字列をオブジェクト名へ変換してしたいと 思ってるのですが変換方法がわかりません。 もしそういうのAPIなどがあれば教えてください。よろしくお願いします。

  • 非表示になったエクセルは?

    VBAマクロでパソコン画面からエクセルを非表示にする場合、 Sub TEST1() Application.visible = False End Sub で画面からエクセルが消えると思いますが、消えたエクセルはどうなってしまうのでしょうか? 何もしなければいつまでもそのままなのでしょうか? 電源を切ればでてくるのでしょうか? Application.visible = Trueで表示されるのはわかりますが、消えたエクセルにどうやってそのマクロを作動させたら良いのでしょうか? 10秒後に自動的に再表示させる方法はマクロに最初から Application.OnTime Now + TimeValue("00:00:10) などで自動実行させればよいのでしょうが、そうでない場合の再表示方法を教えてください。

  • CSMETE32.OCXが読み込めない

    NEC VALUESTAR NX VC35D/5、OS=Windows98です。 あるソフトを使用していて、データをバックアップするメニューを選択した際以下の表示が出ました。 「実行時エラー 367  カスタムコントロール'CSMETE32.OCX'が読み込めません  または登録できません」 OKボタンを押すとソフト自体が終了してしまいます。 Windowsを再度インストールするなど大掛かりな方法でしか 回避できないエラーでしょうか? 回答をよろしくお願い致します。

  • 下記コードはどう動くと思われますか。

    下記コードはどう動くと思われますか。 WinXP VBA(VB6.0)です。 下記のコードを実行した時、どう動くと思われますか?。 ご教授下さい。 よろしくお願い致します。 ii = Format(Forms!メイン画面![テキストZZZ], "00") If ii = "00" Then Else objrep.Controls("直線A" & ii).Visible = True objrep.Controls("直線B" & ii).Visible = True objrep.Controls("直線C" & ii).Visible = True End If

専門家に質問してみよう