• ベストアンサー

他プロセスのウィンドウをいじりたい

他プロセスのウィンドウをいじりたい 自分でマクロソフトを作ろうとしたのですが、 自分のプロセス内のウィンドウにしかアクセスできないことに気づきました。 やりたいことは  ・他のプロセスのウィンドウのメッセージプロシージャをすりかえて   他のプロセスのウィンドウに送られたメッセージを見たりすること  ・マウスをクリックさせたり、キーボードを押したりすること です。要するに他のプロセスのウィンドウを自分の操り人形のようにしたいわけです いろいろ調べたけれど自分のDLLを読み込むように他のプロセスのメモリを 書き換える方法など、怪しいものしかなかったので 他の方法を教えてください

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

SetWindowsHookEx というフックを使います。 フックするタイミングはいろいろありますので、 必要な個所をフックします。但し、「閉じる」等の イベントとマウス系のイベントはフックタイプが 異なるなど、通常のウィンドウプロシージャとは 違い、分類を掌握しておく必要があります。 また、特定のプロセスだけを選べないので、全ての ウィンドウをフックすることになります。従って、 マシンの性能が劣化する危険があります。 詳しくは上記のAPIをキーワードに調べてください。 >他のプロセスのウィンドウのメッセージプロシージャをすりかえて これはできません。プロテクションモードのCPU ではプロセス毎のメモリ空間は保護されているので、 ポインタが同じ値を示してもメモリ空間は別物に なっています。また、コード部は変更することが できません。書き込もうとすると例外が発生します。

Sweet_potato
質問者

お礼

正しいやり方があったのですね。 あきらめかけていました。 これから試してみるところです。 本当にありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • YUI_AI
  • ベストアンサー率45% (303/661)
回答No.1

http://social.msdn.microsoft.com/Forums/ja-JP/vcgeneralja/thread/bf121232-1499-49bb-993f-ccc37b4d9401/ http://dobon.net/vb/bbs/log3-20/12272.html 上記に近い事がやりたいとの認識で宜しいでしょうか? 基本的には操作したアプリケーションのウィンドウハンドルを取得する FindWindow(WIN API) 取得したハンドルに対してPostMessage、SendMessageでメッセージでWindowメッセージを送信してあげれば可能かと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 使われないウィンドウメッセージ

    ウィンドウプロシージャをウィンドウメッセージを受け取るだけでなく、個人的なメッセージを送ってシグナル関数の代用にしたいなと思ったのですが、ウィンドウズが使っていない、これから使われないウィンドウメッセージの値はありますか?プロセス間でのシグナル受け渡しのため、ウィンドウプロシージャをシグナル関数の代用にすると、メッセージループがそのまま使えて好都合なのです。 今は処理する必要が無いウィンドウメッセージを代用として使っていますが、何だかスマートではないのでそういうウィンドウメッセージがあれば教えてください。例えば9x系で使われていたが、NTでは使用されないウィンドウメッセージ等。 回答よろしくお願いします。

  • プロセス間でのメッセージキュー送信

    Linux初心者です。 あるプロセスが生成したメッセージキューへ、別のプロセスからメッセージキュー送信する場合、キューIDを指定する必要があります。 しかし、Linuxでは仮想メモリを使用しているため、共有メモリにアクセスできないはずで、異なるプロセス間でキューIDを共有する方法がわかりません。。 メッセージキューについて以下のサイトでサンプルプログラムが紹介されていますが、2つのプロセスが親子関係であるため、キューIDを共有できています。 http://linuxmag.sourceforge.jp/Japanese/March2003/article287.shtml そもそも、親子関係がないとプロセス間通信ができないのでしょうか? ご存知の方、よろしくお願いします。

  • Access2000のプロセスが残る

    Access2000のプロセスが残る こんにちわ、いつもお世話になってます。 実行環境:WindowsXP Pro、Access2000、アプリ1(VB.NET作成) 開発環境:Windows7、Access2007、VB2008、アプリ1(VB.NET作成) VB.NET作成アプリはSQLサーバに情報を登録し 登録された情報をもとに印刷用テーブルを作成し Accessのマクロを起動させるプログラムです。 AccessはリンクテーブルでSQLサーバと接続され、 印刷用のレポートがあり、マクロはレポートを起動するものです。 プログラムは以下のような記述をしています。 ============================================ Dim oAcs As Access.Application oAcs = New Access.Application oAcs.OpenCurrentDatabase("C:\Print.mdb") oAcs.DoCmd.SetWarnings(False) oAcs.DoCmd.RunCommand(10) ' ウィンドウの最大化 oAcs.DoCmd.OpenForm("印刷") '印刷マクロ起動 oAcs.DoCmd.Maximize() ' 画面の最大化 oAcs.Visible = True AppActivate("Microsoft Access") oAcs.DoCmd.RunCommand(10) ' ウィンドウの最大化 ============================================ レポート表示後の印刷は自動ではないため Accessを起動したら起動しっぱなしになってます。 解放処理をしていないのでプロセスが残るのは既知です。 開発環境にてアプリ1を実行させAccessでレポートを表示させます。 Accessを終了してもプロセスが残りますがアプリ1を終了させると Accessのプロセスは終了します。 実行環境にて上記の同様の動作を行うと アプリ1を終了させてもプロセスが残ってしまう場合があります。 VB.NETで作成された同様のアプリからのAccess起動にも関わらず プロセスが残ってしまうのはAccessのバージョンとかが関係してるんでしょうか? 情報提供をお待ちしてます。

  • 子ウィンドウのデフォルトウィンドウプロシージャについて

    ある本に例えばトップレベルウィンドウがいずれもキーボード入力のメッセージを処理せず、デフォルトウィンドウプロシージャに渡していたするとそのメッセージは親ウィンドウすなわちトップレベルウィンドウへと渡されると載っていたのですが、どういった場合がそうなるのでしょうか?できればプログラムでわかりやすくお願いします。

  • プロセスIDからウィンドウハンドルを取得する方法

    以下の方法を調べていますが、プロセスIDからウィンドウハンドルを取得する方法がわかりませんでした。 (1)自分がCreateProcessで生成したプロセスのウィンドウハンドル (2)自分とは関係ないプロセスで、プロセスIDだけ判明しているプロセスのウィンドウハンドル ご存知の方、ご教授願います。 <環境> WindowsXP VC++6.0

  • excelが別プロセスで起動してしまう

    自分ではお手上げ状態なので、どうか教えてください。 エクセルが常に別プロセスで開いてしまいます。 同一プロセスで開きたいのですが、どうしたら良いでしょうか。 作業環境は、業務の都合でWindowsXPにexcel2000と2007が入っています。 通常使用しているのは2000です。 また、不特定多数のエクセルでマクロを使用するため、personalにマクロを設定しています。 複数のエクセルを開こうとするときに、2つ目以降から 「personal.xlsを読み取り専用で開きますか?」というメッセージが毎回出てきてとても手間がかかります。 personalファイルを削除すれば問題は解決するのですが、 どうしてもpersonalのマクロが必要です。 ちなみに、2つ目以降のエクセルを 右クリック⇒プログラムから開く⇒excel2007 で開くと、 なぜか同一プロセスで開けます。 personalのマクロを残したまま、同一プロセスで開く方法はないでしょうか。 宜しくお願いします。

  • wordの上書き保存が出来ない。他のプロセスが使用

    wordの上書き保存が出来ない。他のプロセスが使用中かアプリケーションを使用中で、上書き保存が出来なくなりました。 windows Vista使用。word2007使用です。 フラッシュメモリのフォルダに入っている。ワードを開き、文字を記入して、上書きをして、また文字入力して、上書きをしようとすると、上書きが出来ません。 また一回上書きをしたワードを開こうとすると、他のプロセス使用中で・・・。が表示されます。 解決方法を分かりやすく教えて下さい。仕事が出来ません。よろしくお願いします。

  • IE9のウィンドウを閉じてもプロセスが削除されない

    こんにちは。 OSは32bit版WindowsVista(SP2)を使っています。 複数のウィンドウでIE9を開き、それらを全て閉じても、 iexplorer.exeというプロセスが消えずに残ってしまいます。 そのせいでメモリ不足が頻繁に起こるので、すごく困っています。 今は taskkill /f /im iexplore.exe というDOSコマンドで、全てのIEプロセスを削除するようにして対応しているのですが、 不便で仕方がありません。 IEのウィンドウを閉じた時に、プロセスが削除されるようにする方法はないのでしょうか? ちなみに、IE8に戻すのが良いというアドバイスをもらったことがあるのですが、 IE9の性能はIE8よりもいいので、IE8に戻すのは避けたいと思っています。 では、よろしくお願い致します。

  • 他のプロセスの描画領域を再描画

    他のプロセスの描画領域を再描画 対象となる他のプロセスのウインドウハンドルやデバイスコンテキストは利用可能のようですが再描画の方法をShowWindow(hWnd, SW_HIDE);ShowWindow(hWnd, SW_SHOW);としているために真っ白な状態が見えたりするのでそれを避ける方法を教えてください。

  • サービスプロセスかどうかを知るには?

    Windows(2000、xp)にて立ち上げられたプロセスが 自分自身でサービスとして立ち上げられたプロセスなのか 通常(cmd等)のプロセスとして立ち上げられたかを 知るにはどうすればよいのでしょうか? ユーザーがSYSTEMとか親プロセスを手繰るぐらいしか 思いつかないので、良い方法が有れば 教えて下さい。

このQ&Aのポイント
  • ヌーベル450用の金属ボビンを購入したが、他のヌーベル機種でも使用可能かどうか知りたい。
  • 特にヌーベル300に対応しているかどうかも確認したい。
  • ブラザー製品についての質問
回答を見る