• 締切済み

Ctrl + P のメッセージ送信

印刷ダイアログを起動させるために Ctrl + P をメッセージ送信しようとしているのですが 書きのように記述しても実現できませんでした. ご存知の方がおりましたら、ご回答いただけませんでしょうか。 PostMessage hwindow, WM_KEYDOWN, 17, 0 PostMessage hwindow, WM_KEYDOWN, 80, 0 PostMessage hwindow, WM_KEYUP, 80, 0 PostMessage hwindow, WM_KEYUP, 17, 0

みんなの回答

  • psychang
  • ベストアンサー率50% (2/4)
回答No.1

私は、VBAでしかやったことがありませんが、"Ctrl + P "をやる前に、"Alt + F"を送ってはどうでしょうか? 検討違いな事を言ってたらごめんなさい?

dcddx
質問者

補足

"Alt + F"とはメニューにカーソルを合わせてからということですか? 一応下記を参考に keybd_event で実現できました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1254391&rev=1 http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200402_04020031.html *************** '印刷ダイアログ起動  Ctrl + P SetForegroundWindow (hwindow) keybd_event VK_CONTROL, 0, 0, 0 keybd_event VK_P, 0, 0, 0 keybd_event VK_P, 0, KEYEVENTF_KEYUP, 0 keybd_event VK_CONTROL, 0, KEYEVENTF_KEYUP, 0 '印刷指示 ENTER keybd_event VK_ENTER, 0, 0, 0 keybd_event VK_ENTER, 0, KEYEVENTF_KEYUP, 0 '終了 WaitTimer 1 Do Until IsWindowEnabled(hwindow) <> 0 WaitTimer 0.5 SetForegroundWindow (hwindow) If IsWindow(hwindow) = 0 Then 'ウィンドウが無いときは抜ける Exit Function End If Loop WaitTimer 1 SetForegroundWindow (hwindow) PostMessage hwindow, WM_CLOSE, 0, 0

関連する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で送る方法でよい方法があれば、お教え下さい。 よろしくお願いします。

  • VC++でCtrl+Vを操作させたい

    VC++のプログラミングで、他のアプリケーションを操作するものを作っているのですが、そこでテキストスペースにCtrl+Vでの張り付けを操作させたいのですが、うまくいきません。 SendMessage(hWndSysLV, WM_KEYDOWN, VK_CONTROL, 0); SendMessage(hWndSysLV, WM_KEYDOWN, 0x56, 0); SendMessage(hWndSysLV, WM_KEYUP, VK_CONTROL, 0); SendMessage(hWndSysLV, WM_KEYUP, 0x56, 0); では不可能なようなのですが、何か方法がありましたらアドバイスいただけるとありがたいです。

  • Excel VBAでIE「ダウンロードの表示」生成

     Internet Explorer で、「ダウンロードの表示」のDialogウィンドウをショートカット(Ctrl + J )を使って表示させたいのですが、Excel VBA で以下のコードで試したのですが、うまくいきません。どういうコードを書いたらよいのでしょうか?アクセスキーを使った方法では、「ツール」で N  に該当するのが「ダウンロードの表示」と「Send To Note」の2つあって起動できません。  よろしくお願いします。 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" _ (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _ ByVal lParam As Long) As Long Public Const WM_KEYDOWN = &H100 Public Const WM_KEYUP = &H101 Public Const VK_CONTROL = &H11 Public Const VK_J = &H4A Public Const navOpenInNewTab = &H800 Sub Test() Dim objIE As Object Dim hWnd_objIE As Long Dim Ret As Long 'IE起動 Set objIE= CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.navigate "https://www.google.co.jp/", navOpenInNewTab Do While objIE.Busy = True Or objIE.readyState <> 4 DoEvents Loop 'objIEのhWnd取得 hWnd_objIE = objIE.hwnd 'IEの親ウィンドウのhWnd取得する 'hWnd_objIE のウィンドウにPostMessageする Ret = PostMessage(hWnd_objIE, WM_KEYDOWN, VK_CONTROL, 0) Ret = PostMessage(hWnd_objIE, WM_KEYDOWN, VK_J, 0) Sleep 100 Ret = PostMessage(hWnd_objIE, WM_KEYUP, VK_CONTROL, 0) Ret = PostMessage(hWnd_objIE, WM_KEYUP, VK_J, 0) End Sub

  • vbで[ctrl]+[tab]を認識させるにはどうしたらよいでしょうか?

    はじめまして、どうしてもうまくいきません。教えてくださいませ。 [ctrl]+[tab]キー入力を認識させるにはどうしたら良いでしょうか? 現在、VBでMDIフォームを使用してプログラムを作っております。 [ctrl]+[tab]キー入力を行なうと、子フォーム間でフォームの移動が起こってしまいます。CommandButton押下時にのみ、フォームの移動を行なうようにしたいので、 [ctrl]+[tab]キー入力を制御して実現させようとしているのですが、うまくいきません。 MSDNライブラリには、KeyUpとKeyDownのイベントで Tabキーの操作は発生しないと書いてありました。。。 何か方法がありましたらお教えいただけると助かります。 どうぞよろしくお願いします。

  • PostMessageで外部のexeへメッセージを送ったときに不具合が出る

    現在、PostMessageを利用して外部のexeへファイル名(フルパス)を送信して、 そのファイルをexeで読み込むようにさせています。 以下、そのプログラムです。 CWnd *hWnd = FindWindow("ConsoleWindowClass", "C:\\WINDOWS\\system32\\cmd.exe"); char str[256]="C://sumple//test.txt\n" int len = 256; for( int i=0; i<len; i++ ){ ____char c; ____c = toupper( str[i] ); ____switch( str[i] ) ____{ ________case '\n': ________c = VK_RETURN; ________break; ____} ____hWnd->PostMessage(WM_KEYDOWN, c, 0 ); } ところが、たとえばファイルパスが"C://sumple//aa.txt\n" のように、同じ文字が連続して存在すると"aa.txt"ではなく"a.txt"として送信されてしまいます。 このような現象にはどう対応すればよいのでしょうか? また、"/"や"."などの記号は"Csumpleaatt\n"のように存在しないとして処理されているようなので case '/': ____hWnd->PostMessage(WM_KEYDOWN, VK_DIVIDE, 0 ); ____break; のように直接仮想キーコードで入力しています。(こちらは上手くいっています) 文字の連続で起こる現象にも使えるかと思って case 'a': ____hWnd->PostMessage(WM_KEYDOWN, 0x41, 0 ); ____break; としてみたのですが、やはり駄目でした。 ファイル名に連続した文字を使わなければいいのでしょうが、汎用性を持たせるためにもどうにか解決したいと思います。 どうかご解答をお願いします。

  • PostMessageで外部のexeへメッセージを送ったときに不具合が出る

    現在、PostMessageを利用して外部のexeへファイル名(フルパス)を送信して、 そのファイルをexeで読み込むようにさせています。 以下、そのプログラムです。 CWnd *hWnd = FindWindow(\"ConsoleWindowClass\", \"C:\\\\WINDOWS\\\\system32\\\\cmd.exe\"); char str[256]=\"C://sumple//test.txt\\n\" int len = 256; for( int i=0; i<len; i++ ){ ____char c; ____c = toupper( str[i] ); ____switch( str[i] ) ____{ ________case \'\\n\': ________c = VK_RETURN; ________break; ____} ____hWnd->PostMessage(WM_KEYDOWN, c, 0 ); } ところが、たとえばファイルパスが\"C://sumple//aa.txt\\n\" のように、同じ文字が連続して存在すると\"aa.txt\"ではなく\"a.txt\"として送信されてしまいます。 このような現象にはどう対応すればよいのでしょうか? また、\"/\"や\".\"などの記号は\"Csumpleaatt\\n\"のように存在しないとして処理されているようなので case \'/\': ____hWnd->PostMessage(WM_KEYDOWN, VK_DIVIDE, 0 ); ____break; のように直接仮想キーコードで入力しています。(こちらは上手くいっています) 文字の連続で起こる現象にも使えるかと思って case \'a\': ____hWnd->PostMessage(WM_KEYDOWN, 0x41, 0 ); ____break; としてみたのですが、やはり駄目でした。 ファイル名に連続した文字を使わなければいいのでしょうが、汎用性を持たせるためにもどうにか解決したいと思います。 どうかご解答をお願いします。

  • ダイアログ間のメッセージの送信について

    いつもお世話になっております。 現在、Visual Studio 2005にてMFCのダイアログベースのアプリケーションを作成しており、メッセージの送信の件で詰まった箇所があり質問させて頂きました。 現在のアプリケーションの全体像なのですが、 ダイアログベースなので、アプリケーション立ち上げ時に1つメインダイアログが表示されます。 そのメインダイアログ内にボタンを設置したとして、それぞれのボタン1,ボタン2からダイアログ1,ダイアログ2をDoModal()で表示させます。 それぞれのダイアログ1,2にはボタンが1つずつ設置されているとします。 質問させて頂きたいことは メインダイアログへダイアログ1,2からメッセージ送信をする場合には ::SendMessage(GetParent()->GetSafeHwnd(),MYMSG,0); でメッセージ送信をすることは出来ました。 しかしメインダイアログから呼び出されるダイアログ1,2間でメッセージを送信する場合に,例えばダイアログ1からダイアログ2へメッセージを送信させたいときに void C****1Dlg::OnBnClicked(){ C****2Dlg m_dlg2; ::SendMessage(m_dlg2.GetSafeHwnd(),MYMSG,0); とダイアログ1のボタンクリック時の関数内にコードを入力してもダイアログ2へメッセージは送信されず(ダイアログ2内のメッセージ受信関数OnMyMsg()が呼ばれず)、そのままスルーされるようなのです。 上述のコードで何か間違えている箇所があるでしょうか? メッセージを扱うのは初めてで、とにかく相手先のウィンドウのハンドルを取得できればいいのかなと思ってコードを書いてみたのですが。。 ご存知の方がいらっしゃいましたら、ご意見宜しくお願い致します。 尚、開発環境は Windows CE 6.0 Visual Studio 2005 です。

  • Thunderbirdの未送信メッセージダイアログ

    Thunderbird でメールを作成し、「あとで送信」を選択して 「ローカルフォルダ」内の 「送信トレイ」にいったん保存してThunderbird を終了し、再度起動すると 「未送信メッセージを送信しますか?」のダイアログが出るはずなのですが、操作をしているうちに出なくなってしまいました。 勿論「未送信メッセージを送信」をクリックすれば送信は可能ですが、この機能を呼び戻す方法をお教えいただけませんでしょうか。 

  • ATLでのPostMessageについて

    ATLでコントロールの開発をしています。 PostMessageでコントロールにメッセージを送信したいのですが、 MFCでいうAfxGetMainWnd()のようなグローバル関数はあるのでしょうか。 ::PostMessage(???, WM_COMMAND, ID_XXXX, NULL);

  • VC++(MFC)でタスクバーに常駐してる状態でメッセージを受け取りたい

    VC++(MFC)でプログラムしています。 画面キャプチャソフトをつくっています。 今現在、PreTranslateMessage(MSG* msg)関数で、WM_SYSKEYDOWNメッセージとWM_KEYDOWNメッセージを拾って、処理するようにしています。これだと、ウィンドウがアクティブな状態だとうまく処理できるのですが、ウィンドウを非アクティブにするとメッセージを拾ってくれません。 理想としてはタスクバーにプログラムを格納しただけの状態でメッセージを拾って処理をしたいのですが、どうやればいいのか方法がわかりません・・ どなたかご教授お願いします。 市販ソフトの紙copiはタスクバーに常駐するだけであとはCtrl+Shift+Gを押せばファイルを保存してくれます。そのようなことがしたいんですが・・

専門家に質問してみよう