アクティブでないWindowにショートカットキーを送る方法はないでしょうか?

このQ&Aのポイント
  • アクティブでないWindowにショートカットキーを送る方法について教えてください。
  • 現在、SetForegroundWindowを使用してキーボードイベントを送っていますが、Windowをアクティブにしないままショートカットキーを送りたいです。
  • Sleepを使用したくなく、Windowを毎回表に出すのも面倒です。別の方法があれば教えてください。
回答を見る
  • ベストアンサー

アクティブでないWindowにショートカットキーを

お世話になります。 趣味でお遊び程度の自己流Windowsプログラミングをしています。 アクティブでないWindow(IsWindowEnabled、IsWindowVisibleでFALESなWindow)にショートカットキーを送る方法はないでしょうか? 現状: if((IsWindow(gethWndsub) != 0) && (IsWindowEnabled(gethWndsub) != 0) && (IsWindowVisible(gethWndsub) == 0) && (IsWindow(gethWndmain) != 0) && (IsWindowEnabled(gethWndmain) == 0) && (IsWindowVisible(gethWndmain) != 0)){ SetForegroundWindow(gethWndsub); Sleep(Sleep_TIME); keybd_event(cont_key, 0, 0, 0); keybd_event(cont_key, 0, KEYEVENTF_KEYUP, 0); return 2; } このようにSetForegroundWindowをしてからキーボードイベントを用いています。 Sleepが気に入らないし、いちいちWindowを表に出すのも気に入らないので、キーボードイベントを使わないでWindowをアクティブにしないままショートカットキーを送る方法にしたいです。 注)Sleepを使っているのは・・・めんどくさかったからです・・・すみません 皆様の豊富な知識をご教授願います。

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

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

Windowプログラムは全てウィンドウプロシージャに メッセージが送られて処理されます。つまり、キーの 押し下げ、解放も同じようにメッセージになって目的の ウィンドウに送られます。よって、該当ウィンドウに、 このメッセージを送ればよいと考えられます。 keybd_event(cont_key, 0, 0, 0); keybd_event(cont_key, 0, KEYEVENTF_KEYUP, 0); 上記の代わりに以下のようにしてみてください。 SendMessage(gethWndsub,WM_KEYDOWN,cont_key,0); SendMessage(gethWndsub,WM_KEYUP,cont_key,0); 勿論、フォーカスを当てたり、休眠する必要はありません。

saikesseix
質問者

お礼

回答ありがとうございます。 ご指導の通りやってみたら一発で解決しました。 新年早々ありがたいです。ありがとうございました。

関連するQ&A

  • 外部アプリ(コマンドプロンプト)の制御

    こんにちは。プログラミング初心者で申し訳ないのですが、調べてみてもどうしても分からない問題があり、ご質問させて頂きました。お手数をおかけしますがご回答頂ければ幸いです。 windowsアプリケーションにて外部のアプリを呼び出し、それを操作しようとした時に、私のような素人が思いつく方法としては、keybd_eventAPIなどでキーを送る、とかWM_LBUTTONDOWNなどのウィンドウメッセージを送る、くらいしか思いつかないのですが、それ以外に外部操作の方法はあるのでしょうか? 例えば、今私が作ろうとしているのは独自アプリよりコマンドプロンプトを呼び出し、事前に指定したいくつかのコマンドを実行する、といったものなのですが、CreateProcessにて起動し、コマンドプロンプトのハンドルを得たところまでは良かったのですが、そのハンドルを利用してどのようにコマンドを送れば良いのかがどうしても分かりませんでした。 「cd ../」というコマンドを送りたい場合、 Keybd_event(Byte('c'),0,0,0); Keybd_event(Byte('c'),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte('d'),0,0,0); Keybd_event(Byte('d'),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte(' '),0,0,0); Keybd_event(Byte(' '),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte('.'),0,0,0); Keybd_event(Byte('.'),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte('.'),0,0,0); Keybd_event(Byte('.'),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte('/'),0,0,0); Keybd_event(Byte('/'),0,KEYEVENTF_KEYUP,0); のようなやり方しか思いつかないのですが、他に良い方法はございませんでしょうか? 宜しければご指導して頂けますよう宜しくお願い致します。

  • Windows7-VB6でのアクティブウィンドウキャプチャ

    Windows7-VB6でのアクティブウィンドウキャプチャ お世話になります。 Private Declare Sub keybd_event Lib "User32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Private Const VK_LMENU = &HA4 Private Const VK_SNAPSHOT = &H2C Private Const KEYEVENTF_EXTENDEDKEY = &H1 Private Const KEYEVENTF_KEYUP = &H2 Private Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long) Private Sub Command1_Click() Command1.SetFocus DoEvents Load form2 Clipboard.Clear keybd_event VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY, 0 keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0 DoEvents keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0 keybd_event VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0 ※form2.picPrint.Picture = Clipboard.GetData() 上記コードはWinXPであれば問題なく動作するのですが Win7ではform2のピクチャボックスにイメージが貼り付けられません ※行にブレイクを入れて、一旦プログラムを停止し再開するとOKで その他にもALTキーの送信をしないでprtscrのみでも動作可能です。 win7-vb6でアクティブウィンドウのキャプチャを クリップボードを使用し、フォームのピクチャボックスに貼り付けることは 可能でしょうか

  • VB6でWindows2003 Serveの画面ハードコピーを取るには

    VB6で画面のハードコピーを取るのに下記のような関数を作成して動作させています。 今回、windows 2003 Serverで初めて使用したのですが、エラーが出力されます。 Public Sub xxxxxx()  Dim OsVer As Single  Clipboard.Clear  OsVer = CreateObject("SysInfo.SYSINFO").OSVersion   If OsVer < 5 Then  '画面全体のスナップショットを取得する(Win98SE/Win95)    Call keybd_event(VK_SNAPSHOT, 1, KEYEVENTF_EXTENDEDKEY, 0)    Call keybd_event(VK_SNAPSHOT, 1, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0) Else    '画面全体のスナップショットを取得する(WinXP)    Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0)    Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)  End If End Sub エラーの内容は ErrNO=429 ActiveX コンポーネントはオブジェクトを作成できません。 と言うエラーなのですが、2003 serverではkeybd_eventの使い方がXp等と違うのでしょうか? 何処が悪いのかおわかりの方ご教示頂けないでしょうか? 宜しくお願いいたします。

  • SendMessage関数がうまく動作しません

     いろんなWindowsのアプリケーションの設定を、プログラムから自動実行するようにしたく、テストでWinodowsのメモ帳の設定を一部自動設定するソースコードを書いてみたのですが、どうもうまくいきません。 実行して、メッセージを表示することはできるのですが、メモ帳のページ設定ウィンドウのエディットコントロールに、目的のテキストが入力されません。 コントロールのIDも、何度も確認したので、間違ってはいないと思うのですが、なぜ、目的のテキストが入力されないのでしょうか。 SendMessage関数の参考ページは、いろいろと調べてみまして、目的のことをするのであれば、以下で問題なと思うのですが、なぜか、うまくいきません。 もし、お分かりの方がいらっしゃったら、お知恵を拝借いただけないでしょうか。 ■ 開発&実行環境 Windows XP XP3 32bit c++ ■ 動作  Winodowsのメモ帳のページ設定ウィンドウが開いているときに、フッター(F)のエディットコントロール のテキストを既定のものに置き換える。 ■ ソースコード /* 取りあえず、よく利用しそうなものをインクルード */ #include <windows.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <commctrl.h> #include <tchar.h> DWORD dwSleepTime = 3000; DWORD dwSleepTime1 = 1000; DWORD dwSleepTime2 = 5000; void SendKeysC( BYTE bVk // 仮想キーコード ) { // キーの押し下げをシミュレートする。 keybd_event( bVk, MapVirtualKey(bVk, 0), KEYEVENTF_EXTENDEDKEY | 0, 0 ); // キーの解放をシミュレートする。 keybd_event( bVk, MapVirtualKey(bVk, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); } void SendKeysExC( BYTE bVk1, // 仮想キーコード BYTE bVk2 // 仮想キーコード ) { // キーの押し下げをシミュレートする。 keybd_event( bVk1, MapVirtualKey(bVk1, 0), KEYEVENTF_EXTENDEDKEY | 0, 0 ); // キーの押し下げをシミュレートする。 keybd_event( bVk2, MapVirtualKey(bVk2, 0), KEYEVENTF_EXTENDEDKEY | 0, 0 ); // キーの解放をシミュレートする。 keybd_event( bVk2, MapVirtualKey(bVk2, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); // キーの解放をシミュレートする。 keybd_event( bVk1, MapVirtualKey(bVk1, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); } int main(int argc, char *argv[]) { HWND hWnd1; HWND hWndTmp; char *sNum; LPCTSTR lpszText; lpszText = _T("サンプル"); sNum = "start"; MessageBox(NULL, "フォアグラウンドウィンドウを選択してある?", "OK", MB_OK); hWnd1 = GetForegroundWindow(); Sleep(dwSleepTime); SendKeysC(0X09); Sleep(dwSleepTime); //メモ帳のページ設定ウィンドウのフッター(F)のエディットコントロール hWndTmp = NULL; hWndTmp = GetDlgItem(hWnd1, 122); SendKeysExC(0X10, 0X09); Sleep(dwSleepTime); ::SendMessage(hWndTmp,WM_SETTEXT,0,(LPARAM)"test"); Sleep(dwSleepTime); return 0; }

  • Ctrl+Vのキーストロークを合成したいのですが

    Ctrl+Vのキーストロークを合成して、クリップボードの内容を貼り付けたいと考えています。 いろいろ調べた結果、大体以下のように記述すればよいのではないかとおもったのですが記述に間違いがあるようです。(form上のText1内に張り付けることができません。)恐れ入りますが、何卒ご教授いただきたくお願いいたします。 Option Explicit Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, _ ByVal bScan As Byte, _ ByVal dwFlags As Long, _ ByVal dwExtraInfo As Long) Private Const KEYEVENTF_EXTENDEDKEY = &H1 Private Const KEYEVENTF_KEYUP = &H2 Private Const VK_CONTROL = &H11 Private Sub Command1_Click() Call keybd_event(VK_CONTROL, 0, 0, 0) Call keybd_event(Asc("V"), 0, 0, 0) Call keybd_event(Asc("V"), 0, KEYEVENTF_KEYUP, 0) Call keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0) End Sub ちなみに使用目的につきましては、form1上のWebBrowser1に開いた入力フォームの<input type="file" >に(JavaScriptでフォーカスを移したうえで)ファイルのパスを貼り付けることです。 <input type="file" >はvalueを指定できないようなので、色々考えた結果、上記のようにするしかないかと考えました。もしもほかによい方法があったら恐れ入りますがご教授いただけると大変ありがたいです。よろしくお願いします。

  • C/C++でIEの選択範囲を取得する方法

    C/C++で、IE上で範囲選択している場合に、別のアプリケーションからその選択範囲を取得する方法をおしえてください。 今は、IEにCTRL+Cを送って、クリップボード経由で取得する方法を検討しています。 以下のようなコードで、範囲選択をしているウィンドウのタイトルは取れているのですが、クリップボードへのコピーができていません、ハンドルが違うような気がするのですが... どうすればよろしいのでしょうか?? char buf[1000]; HWND hWndFore; /* フォアグラウンドウィンドウの取得 */ hWndFore = GetForegroundWindow(); /* ウィンドウタイトルの表示 */ GetWindowText(hWndFore, buf, 1000); //MessageBox(NULL, buf, "DoGetForegroundWindow", MB_OK); keybd_event(VK_CONTROL, 0, 0, 0); keybd_event('C', 0, 0, 0); keybd_event('C', 0, KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); よろしくお願いいたします。

  • キーボード処理 SDK

    クライアントがサーバを操るツールを作っています。 何をしたいか↓ ・クライアントはサーバの画面上でメモ帳を開き「日本語」入力をする。 (クライアントからサーバの画面上で「(0~9)(a~z)」は打てます。) □サーバ側 case WM_KEYDOWN: //押されたときの処理   //送られてきたキーイベントの実行   keybd_event(cmsg.wParam,cmsg.wParam,0,0);   break; case WM_KEYUP: //離されたときの処理:解放処理   keybd_event(cmsg.wParam,cmsg.wParam,KEYEVENTF_KEYUP,0);   break; □クライアント //キーボード処理 case WM_KEYDOWN: 環境 WindowsXP MicrosoftVisualC++ SDK お願いします。

  • NumLockの制御について

    VB5.0(SP3)で次のプログラムを作成しました。 キーボードからNumLockキーを押して状態をOFFにすると、プログラム側(タイマー関数内)でその状態をチェックし、状態をONに戻します。 しかし、次の動作をした時に問題が発生しました。 但し、この問題は、OSがWindowsNT4.0(SP6)の端末で発生するのですが、Windows2000/XP では発生しませんでした。 起動したフォーム画面にフォーカスがある間は問題ないのですが、フォーカスを外した状態でNumLockキーを押して状態をOFFにすると、ON/OFFが繰り返されてしまいます。 この時に、マウスをフォーム画面の上に持ってくるとその繰返し処理が止まります。 もちろん再度 NumLockキーを押しても止まります。 OSの問題なのでしょうか?それともプログラムが悪いのでしょうか? 下記にそのプログラムを表記します。 <プログラム> フォーム(Form1)にタイマー(Timer1)を貼りつけただけです。 (Module1.bas) Option Explicit Public Const VK_NUMLOCK = &H90 Public Const KEYEVENTF_KEYUP = &H2 Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, _                        ByVal bScan As Byte, _                        ByVal dwFlags As Long, _                        ByVal dwExtraInfo As Long) (Form1.frm) Option Explicit Private Sub Form_Load()   Timer1.Interval = 100 End Sub Private Sub Timer1_Timer()   On Error Resume Next   If GetKeyState(VK_NUMLOCK) = 0 Then     keybd_event VK_NUMLOCK, 0, 0, 0     keybd_event VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0   End If End Sub

  • 音量調整ショートカットキー

    マウスで音量調整するのがめんどくさいので ショートカットキーで音量調整しようと思ったら 今使ってるパソコンは本体はVistaなのですがOSはXPなのでFnキーがキーボードにありません 検索するとXPの音量調整ショートカットキーはFnキーを使うみたいなので どうかキーボードで簡単に音量調整をする方法はありませんか?

  • windows7 キーでスリープにできますか

    windows7を使っています。 スリープにできるキーの付いていないキーボードに買い替えた為、簡単にスリープにできる方法を知りたいのですが、ショートカットキーは簡単に作成できますか。 windows7でショートカットキーを作成する方法を検索してやってみたのですが、なぜかデスクトップ上にアイコンを作成する方法になってしまいショートカットキーを作れませんでした。 もしご存知の方おりましたら、回答よろしくお願い致します。

専門家に質問してみよう