• 締切済み

他アプリへメッセージ送信

WinXp+VB6です。 あるアプリケーションが2つあります。 アプリAにPageDown,PageUpが送られたときに、アプリBへAlt+N,Alt+Pが送られるように、アプリAを自作したいと考えています。アプリBは、現存する他者作成のアプリです。いじれません。 仕様はかなり限定しても構いません。 他のソフトは同時起動しないで、この2つのみが動くものとしています。アプリAにいつもフォーカスを置くようにしたいと思っています。 メッセージをフックしようかとも考えたのですが、アプリAにフォーカスを持たせておけば、そこからPostMessageなどで何とか出来ないかなとも考えました。 そこでお聞きしたいのが、 1:アプリAにいつもフォーカスを持たせておくにはどうするか 2:「Alt+N」をPostMessageで送るにはどうするか 3:サブクラス化してフックしたほうが楽なのか 良い案がありましたら、よろしくお願いします。

  • cip
  • お礼率53% (44/83)

みんなの回答

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

ちょっと間違い。 WM_KILLFOCUSじゃなくてWM_ACTIVATEでした。

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

>1:アプリAにいつもフォーカスを持たせておくにはどうするか SetWindowsHookExでグローバルフックかけて、アプリAのWM_KILLFOCUSを監視してれば出来なくもないですが、タスクバーをクリックするとか他のこと何も出来なくなりますよ、それって。 >2:「Alt+N」をPostMessageで送るにはどうするか WM_KEYDOWN、WM_KEYUPを送ってください。 送り方は調べてください。 >3:サブクラス化してフックしたほうが楽なのか サブクラス化してフックとは? どのウィンドウをサブクラス化? 自プロセス以外はまともな方法ではサブクラス化出来ません。

関連するQ&A

  • Alt+P,Alt+NをPostmessageで送るには

    あるアプリがあり、そのハンドルを取得してからメッセージを送るプログラムを作っています。 PageUp,PageDownをそれぞれAlt+P,Alt+Nに変換して送るものです。 関数・定数宣言部は省略しています。 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)   Dim hTest As Long   hTest = FindWindow(vbNullString, "Test")   If KeyCode = 33 Then 'PageUp     PostMessage MPL, WM_SYSKEYDOWN, VK_ALT, 0     PostMessage MPL, WM_KEYDOWN, VK_N, 0     PostMessage MPL, WM_KEYUP, VK_N, 0     PostMessage MPL, WM_SYSKEYUP, VK_ALT, 0   ElseIf KeyCode = 34 Then 'PageDown     PostMessage MPL, WM_SYSKEYDOWN, VK_ALT, 0     PostMessage MPL, WM_KEYDOWN, VK_P, 0     PostMessage MPL, WM_KEYUP, VK_P, 0     PostMessage MPL, WM_SYSKEYUP, VK_ALT, 0   End If End Sub 送り先(Test.exe)では、 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)   Dim L As String   L = ""   If Shift = 4 Then L = "Alt + "   Label1.Caption = L & KeyCode End Sub ラベルで「Alt+P」などが来ているかどうか見ています。こちらのウィンドウで「Alt+P」を押すとちゃんと表示されます。 しかし、この2つを組み合わせるとPのみやNのみしか送られてきません。どこかおかしいのでしょうか。 Alt+PなどをPostMessageで送る方法でよい方法があれば、お教え下さい。 よろしくお願いします。

  • ListViewで、PageDownキーイベントを発生させるには?

    VB6で開発しています。 ラベルとListViewのみのフォーム上で、 PageUpやPageDownキー押下で、イベントを発生させたいのですが、 PageDownを押下すると、ListView内のリストのカーソルが下に移動してしまい、 (フォーカスが当たるコントロールがListViewしかないためと思われますが) イベントが発生せずに困っています。 自分で実現しようとしてできなかった方法を紹介します ・リストビューにフォーカスが当たらないようにする。   Enabled = Falseだとスクロールバーが使えないので困る。    ・ListViewはEnabled=Falseにし、スクロールバーコントロールを使って、スクロールさせる。   スクロールさせる方法が見つかりませんでした。 何か、よいアイデアや方法があれば、ご教授宜しくお願いしますm(_ _)m

  • Ctrlキー+HomeキーでセルA1へ移動できない

    Excelのキー操作によるアクティブセルの移動で出来ない操作があります。 例えば ● Ctrlキー+HomeキーでセルA1へ移動する           ● Ctrlキー+Endキーでデータの入力されている四角い範囲の一番右下の       セルに移動する           ● Shiftキー+Homeキーで選択範囲を行の先頭まで拡張する     ● PageDownキー・・・・1画面下にスクロールする     ● PageUpキーで・・・1画面上にスクロールする           ● Alt +  PageDown・・・1画面右にスクロールする     ● Alt +  PageUp・・・1画面左にスクロールする OSはWindows2000です。 何故こんなに出来ない操作があるのでしょう。教えてください!      

  • SSTABでのKEYDOWNイベント

    VB6・SP5で開発を行っています。 FormのKEYDOWNイベントでPageUp・PageDownの押下の際に、 SSTAB上のアクティブなTABをずらす処理を行おうとしています。 問題はSSTAB上にフォーカスが移った直後だけ、 KEYDOWNイベントが2回実行されてしまうというものです。 KEYUPについても同様でした。 このような現象をご存知の方、 対処方法をお教えくださる方がいらっしゃいましたらよろしくお願いします。 ちなみにモジュール変数等のフラグはなるべく使用したくありません。

  • VB.NET 外部アプリの制御

    VB.NET(VB2010)で二つアプリケーションの制御を考えています。 親アプリA、子アプリBとして、基本的にはアプリAからアプリBの起動・停止を行います。 ただ稀に、アプリB単体でアプリ停止をする必要があります。 その際、常時稼働中のアプリAから、アプリBが停止したことまで検出できます。 しかし、その後のアプリBの起動をアプリAから行わず、ショートカットから行った場合 アプリAからアプリBを制御できるのでしょうか? 単純にするには、全てアプリA経由でやるべきですが、アプリB単体でも起動したいという ニーズがあり困っています。 技術的に可能でしょうか?

  • アカウント変更前のアプリは利用出来ませんでしょうか

    1台のiPod Touchを使っているのですが、質問させてください。 以前、そのiPodにAという日本のAppleアカウントを使って、A'というパソコンで使用していました。 その後、自分が色々な国に滞在したりするため、アカウントをアメリカのBというのに変え、パソコンもB'に変えました。 勿論、パソコンB'に変えた際にアプリや写真、曲なども全て消えてしまいました。 それは最初から覚悟していたので良かったのですが、 以前購入したアプリをもう一度使いたいと思いまして。 A'というパソコンは現存して、その中にAの頃購入していたアプリ等も入っているのですが、 それを今の環境で使うようなことは出来ないのでしょうか? 例えばパソコンA'からパソコンB'に入れて、iPodに入れるとか。 アドバイス頂けないでしょうか? 宜しくお願い致します。

  • 文字入力モードの切り替え

    はじめまして。 いきなりで申し訳ありませんが、よろしくお願いします。 Aテキストボックスにはひらがな Bテキストボックスには半角英数 Cテキストボックスにはカタカナ テキストボックスにフォーカスしたときに自動でIMEが切り替わり、それぞれに設定した文字で入力する。 と言う設定をしたいのですが、ソフトを立ち上げても右下のタスクバーにIMEが表示されておらず、テキストボックスにフォーカスしてもうまく機能しないのです。 一度でも「Alt+半角/全角」でIMEを右下のタスクバーに表示してやるとそれ以降はうまくいくのですが・・・・・ ソフトを立ち上げたときにIMEが機能するようにしたいのですがどうすればよいでしょうか? なにぶん初心者なのでわかりにくい質問かと思いますが、よろしくお願いします。 環境:VB2008 VS2008Express Editionで開発しています。

  • [VB.NET]最適なサーバ送信方法とは?

    凄く迷っているのですが、例えば[A]のIPから[B]のIPに送信して自作アプリのコンソールを再起動する プログラムを作ろうかと検討しているのですが、実際に送信する場合 コードの量及び送信方法は、どの方が適しているでしょうか? 1. ASP.NET Aのクライアントから送信して、Bのサーバに受信し CUIを再起動する方法 2. VB.NET DOBON.NET様の「TCPクライアント・サーバープログラムを作成する」を改良して 受信の際にProcess.WaitForExitメソッドで閉じる また他の方法があれば教えてください。

  • 別アプリ終了させる

    いつもお世話になります。 再度質問ですが、 A.EXEとB.EXEがあり、B.EXEはA.EXEからShellExecuteで起動させています。 起動したB.EXEからA.EXEを終了させたいのですが、それにはA.EXEの ウィンドウハンドルが必要になると思います。 このときにA.EXEのタイトルは動的に変更されるので、FindWindowは使えません。 そこでA.EXEからB.EXEを起動した時にhWNDを送ってやれば、B.EXEからA.EXEを 操作できるとおもいます。 hWNDを対象アプリに送りたいのですが、ShellExecuteやCreateProcessのパラメータにhWndを持たすことはできるのでしょうか? もたせることができそうですが、具体的にどう記述すればいいのかが わからないので、サンプルソースをつけていただければありがたいです。 見当違いであれば、別の方法をご教授ください。 よろしくお願いします。

  • VCで作ったDLL【否 .Net】 配列

    VCでDLLを作り、VBから呼び出しています。 今やりたいのは、Cで言えば void Calc(int a, int b, int x[]) {  x[0] = a + b;  x[1] = a - b;  x[2] = a * b; } int main(int argc, char *argv[]) {  int n[3];  Calc(8,1,n);  printf("%d %d %d\n",n[0],n[1],n[2]);  return 0; } と、いうことです。 関数Calcを__stdcallやdefファイルを使って呼び出せるようにし、VBから呼ぶのですが、うまくいきません(~~メモリが"written"になることは~~)。 VBでは Declare Sub Calc Lib "SimpleDll.dll" (ByVal a As Long, ByVal b As Long, ByRef x() As Long) …略… Dim x(3) As Long Call Calc(6, 4, x) …略… としています。 どうかお力添えを。

専門家に質問してみよう