• ベストアンサー

VC++の自動キー入力プログラム

SendInput()関数を使ってキーを自動入力することに 関して質問したばかりなのですが、 当方のWin XP PRO SP2の場合使うことはできないのでしょうか? (MDSNにはNT SP4以降と書いてありました。) この場合は古い関数か何かがあるのでしょうか? ちなみにそのPCでデバッグをかけると  lpKey は定義されていない」 というエラーをはじめ変数がほとんどはじかれます。

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.6

★アドバイス >の部分までで、キー入力されたことになっているのでしょうか?  ↑  いいえキー入力されたことにはなりません。  単にINPUT構造体にデータをセットしただけです。  SendInput()関数を実行して初めて『S』キーが押されたのと同じになります。 ・SendInput()関数の戻り値を調べてみましたか?  ifで分岐して正常、エラーのどちらが表示されますか?  MessageBox()などで確認して下さい。  エラーならINPUT構造体のセット内容の不正かも知れません。  私の載せたサンプルは『マルチバイト文字』を想定した書き方です。  オプション設定で『Unicode文字』を使う設定ですか?

rairarai
質問者

お礼

SendInput()関数を入れたら問題なく作動しました。 とんちんかんな事聞きましてすみません。 ありがとうございました。

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

その他の回答 (5)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★アドバイス  回答者No.4さんのアドバイス通りでしょう。  前回の質問でサンプルを載せましたがインデントを全角空白で書いています。  タブ文字だとインデントがなくなるためです。  よってサンプル・ソースでインデントされていれば全角空白だと考え  今後コピー&ペーストするときにタブ文字に修正して下さい。  ※少なくとも私が貼り付けるサンプルは全角空白でインデントしてます。

rairarai
質問者

補足

ありがとうございます。まだ自動入力動作自体は できておりませんが、 お陰様でとりあえずエラーは出なくなりました。 度々すみません。もう一点お伺いしたいのですが、 頂いたサンプルプログラムの if ( SendInput((UINT)(lpKey - Key),Key,sizeof(INPUT)) == (UINT)(lpKey - Key) ){  正常 } else{  エラー } の部分をなくしても setKeybrd( lpKey++, 'S', TRUE ); setKeybrd( lpKey++, 'S', FALSE ); の部分までで、キー入力されたことになっているのでしょうか? おそらく私の使用しているプログラム自体に 問題があるのですが、上記のやり方で 実行しても「S」の自動入力がされていないみたいでして。

全文を見る
すると、全ての回答が全文表示されます。
  • Werner
  • ベストアンサー率53% (395/735)
回答No.4

> error C3872: '0x3000': この文字を識別子で使用することはできません 全角空白が混じっているので削除してください。

全文を見る
すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★補足要求です。 >変数の宣言・ヘッダのインクルードなどはまったくしていないのですがこれが原因なのでしょうか?  ↑  『windows.h』はインクルードしていますか?  これがないとINPUTやLPINPUT型でエラーになります。  インクルードしていないのならば  #include<windows.h>  を1行追加して下さい。 ・これ以外が原因ならば全ソースを貼り付けるか、エラー内容を貼り付けて下さい。

rairarai
質問者

補足

すみません。#include<windows.h>をつけても下記のエラーです。error C3872: '0x3000': この文字を識別子で使用することはできません error C2065: ' lpKey' : 定義されていない識別子です。 error C2227: '->type' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。 型は ''unknown-type'' です。 error C3872: '0x3000': この文字を識別子で使用することはできません error C2227: '->ki' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。 型は ''unknown-type'' です。 error C2228: '.wVk' の左側はクラス、構造体、共用体でなければなりません error C3872: '0x3000': この文字を識別子で使用することはできません error C2227: '->ki' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。 型は ''unknown-type'' です。 error C2228: '.wScan' の左側はクラス、構造体、共用体でなければなりません error C3872: '0x3000': この文字を識別子で使用することはできません error C2227: '->ki' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。 型は ''unknown-type'' です。 error C2228: '.dwFlags' の左側はクラス、構造体、共用体でなければなりません error C3872: '0x3000': この文字を識別子で使用することはできません error C2227: '->ki' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。 型は ''unknown-type'' です。 error C2228: '.dwExtraInfo' の左側はクラス、構造体、共用体でなければなりません error C3872: '0x3000': この文字を識別子で使用することはできません error C2227: '->ki' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。 型は ''unknown-type'' です。 error C2228: '.time' の左側はクラス、構造体、共用体でなければなりません error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません error C2365: 'setKeybrd' : 再定義; 以前の定義は '関数' でした。 c:\documents and settings\すがp\my documents\visual studio 2005\projects\golfp\tiem.cpp(27) : 'setKeybrd' の宣言を確認してください。 error C2078: 初期化子の数が多すぎます。 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません error C2365: 'setKeybrd' : 再定義; 以前の定義は '関数' でした。 c:\documents and settings\すがp\my documents\visual studio 2005\projects\golfp\tiem.cpp(27) : 'setKeybrd' の宣言を確認してください。 error C2078: 初期化子の数が多すぎます。 error C2059: 構文エラー : 'if' error C2143: 構文エラー : ';' が '{' の前にありません。 error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)

全文を見る
すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★前回回答した者です。 ・こちらの環境は Windows XP SP2 です。  ちゃんと動作しています。  よってソースの記述に誤りがありそうな気がします。  補足にソースを貼り付けてみて下さい。  もしかしたら解決するかもしれません。 >(MDSNにはNT SP4以降と書いてありました。)  こう書かれているのならば  Windows NT SP4  Windows 2000  Windows XP  Windows Vista  でも使用可能という意味です。

rairarai
質問者

補足

お世話なります。 実は知人のプログラムベースでコピペをしたら 動いたのですが、私のプログラムにそれを写したところ エラーが出てしまいました。 変数の宣言・ヘッダのインクルードなどはまったくしていないのですがこれが原因なのでしょうか? ちなみにプログラムはほぼそのまま VOID setKeybrd( LPINPUT lpKey, WORD wVKey, BOOL bKeyDown ) {  lpKey->type = INPUT_KEYBOARD;  lpKey->ki.wVk = wVKey;  lpKey->ki.wScan = (WORD)MapVirtualKey( wVKey, 0 );  lpKey->ki.dwFlags = (bKeyDown ? 0 : KEYEVENTF_KEYUP);  lpKey->ki.dwExtraInfo = 0;  lpKey->ki.time = 0; } INPUT Key[ 2 ]; LPINPUT lpKey = Key; setKeybrd( lpKey++, 'S', TRUE ); setKeybrd( lpKey++, 'S', FALSE ); if ( SendInput((UINT)(lpKey - Key),Key,sizeof(INPUT)) == (UINT)(lpKey - Key) ){ //”S”を押すと実行する既存のプログラム } といった感じで使わせてもらっております。

全文を見る
すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

実行時エラーですか? ビルド時のエラーですか?

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

関連するQ&A

  • ダイアログベースでのキー入力について

    現在Win2000、VC++6.0でダイアログベースのアプリを作っています。 ボタンの存在しないダイアログにしているので、 終了するにはタスクバーから閉じるか、ALT+F4キーだけしかないと思っていましたが、 Enterキーを押すと終了してしまうことに気づきました。 このEnterキーを押すと終了してしまうのを回避するには どうしればいいのでしょうか? それと、もう一つ質問なのですが、 WM_CHARメッセージハンドラを追加しましたが、 キーを入力してもOnChar関数にやってきません。 (デバッグでブレークポインタを置いてみたのですが・・・) なにを間違えているのかが分かりません。 どうぞよろしくおねがいします。

  • numlockと10keyについて

    IBM thinkpad z60m win-xp pro sp2 USB接続の10KEYをつけたところ、NUMLOCK ONで 10KEYで数字が入力できますが、 キーボードで、0を入れると/、Uを入れると4のようのにデータエントリー型キーボードになってしまいます。これを解決するにはどのようにしたらよいのでしょうか。よろしくお願いいたします。

  • 変数など厳密なプログラムが書きたいのですが、どうすればよいでしょうか?

    PHPで関数の引数に渡すとき、以下のように$aaを$aとしてしまった場合に 関数内の$idは値がありませんが、関数内でこれを検出することができるのでしょうか? Perlなら use strict;とし、my等で定義されていない変数はすべて警告表示されますが、PHPはスルーです。 変数など厳密なプログラムが書きたいのですが、どうすればよいでしょうか? $aa = 1; test($a) function test($id){ ... }

    • ベストアンサー
    • PHP
  • Win32APIを使って入力されたキーによって表示する画像を変えるプログラムについて

    Win32APIを使って入力されたキーによって表示する画像を変えるプログラムを今、VisualSutudio2005のVC++で作っている最中なのですが、 上手く画像が表示されず困っています。具体的には、キーボードからキーが入力されたらTranslateMessage関数でWM_CHARメッセージを送って、その値(wParam)をWM_CHARメッセージ内でTCHAR型の変数に代入し、InvalidateRect関数を使ってWM_PAINTメッセージを送って、再描画処理を行ってその中で、if(tchar == 'a') { hbitmap = (HBITMAP)LoadImage(NULL,BMP,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); SelectObject(hMemdc,hbitmap); GetObject(hbitmap,sizeof(BITMAP),&bitmap); BitBlt(painthdc,0,0,350,467,hMemdc,0,0,SRCCOPY); } という処理をしてaが入力されたら読み込んだ画像を表示!という形にしたいのですが、実際ウィンドウには表示されなくて悩んでいます。わかりにくくて誠に申し訳ありませんが、どなたかどうかご教授願えないでしょうか。何卒よろしくお願い致します。

  • VC++のCOMのデバッグ方法について

    VC++でつくられたCOMをデバッガを使ってデバッグしたいのですが どのようにすればいいのか、よい手段がわからず困っています。 いま担当しているプログラムの作りとしては、 2つの実行可能形式ファイル(AAA.exeとBBB.exe)があって、 AAA.exeは、 単独で動かした場合は自分のクラスをレジストリ登録/解除するプログラムで それ以外にもいくつかの関数(後述のfunCCC関数やログ出力関数)を実装しています。 BBB.exeは、CoCreateInstance関数を使用してAAA.exe内のクラスのオブジェクトを作成して その中で定義されている関数(funcCCC)にアクセスしています。 AAA.exeを実行してCOMがレジストリ登録されていることは レジストリエディタで確認できていて、 また、BBB.exe内でCoCreateInstance関数が成功していることも、 funcCCCが実行されて正常で結果が戻ってきていることもプログラムの実行結果からわかります。 この状態で BBB.exeからfuncCCCをコールしたときに AAA.exeのfuncCCCにステップインしてデバッグしたいのですが このようなことは、たとえばVisualStudio(2003)のデバッグ機能でできるのでしょうか。 デバッグしたい理由としては、AAA.exeの単体テストを行うためと、 あと、AAA.exe内のログ出力関数が AAA.exeを単独で起動したとき、つまり 自分のクラスをレジストリ登録するときは正常にログ出力されているのですが BBB.exeからfuncCCCを実行したときは、 funcCCC内で同じログ出力関数をコールしているのにログが出力されていないので デバッガを使って内部でどういう状態になっているのかを確認したいのです。 ログが出力されないので MessageBox関数を埋め込んでトレースや変数の内容を確認しているのですが その結果ではAAA.exeを単独で実行したときと同じように ログ出力関数がコールされているように見えます。 また DebugBreak関数を使う方法というのを見かけたので funcCCC内でDebugBreak()を実装してみたのですが その場合は、DebugBreakのところでプログラム(BBB.exe)が終了してしまいます。 COMについて認識違いがあればご容赦下さい。 よろしくお願いいたします。

  • Altキーが使えない。

    タイトルのとおり、Altキーが使えません。 そのほかのキーは正常なのですが、 Alt+アルファベットやAlt+Ctrl+Deleteが、まったく認識されず、困っています。 ドライバは日本語PS/2-106/109Ctrl+英数です。 左右とも、同じAltキーが使えません。 ウイルスチェックはAvast!を自動更新させています。 ファイアーウォールはZoneAlarmを使ってます。 Win XP SP1 デスクトップのSONY/VAIOです。

  • 再計算の自動化・手動化について。

    Windows NTでExcel 2000を使っています。 Excel VBAでユーザー定義関数を作り、いろんな場合分けで計算できるようになったのはいいのですが、自動計算の Application.Volatile を文頭に置いているので操作のたびに再計算をして動作が遅くなってしまいました。この関数を使ったファイルに時間がかかるのは仕方ないことでも使っていないファイルまでたびたび再計算されてしまうのではさすがに困ってしまいます。数値を変更したときなど、自分の都合に合わせて再計算ができるようにならないものでしょうか。 他の方の質問を見たところ、文頭に手動化の文を置いて、最後に自動化の文を置くようアドバイスしてありましたがこれではファイルを閉じない限り再計算されないのではないかと心配になり、質問をしてみました。よろしくお願いします。(この文頭を持ったファイルを複数開いて作業しているのも関係あるのでしょうか?)

  • SP3自動更新について

    当方のPC Win XP RC版SP3 v.3264をインストールしています。 最近、自動更新でSP3が更新項目に上がってるとの事ですが、当方には何も来ていません。 自動更新設定はOKです。手動でも試しましたが「お使いのPCには更新項目ありません」と告知されました。 RC版には対象外という事でしょうか?それとも遅れているだけ? ご教授お願いします<(_ _)>

  • Enterキーの挙動

    Windows7 Pro SP1 Excel2010 SP2 Enterキーですが、デフォルトで下のセルに移動するようになっています。 例えば、J8セル入力後、Enterキーを押すと、I9やH9に移動することがあります。移動するセルは毎回ほぼ同じセルでマウスのカーソルでI9等に合わせています。 編集済みのbookにより挙動は変わりますが、Excel2010って学習能力があるのでしょうか。 はじめのころは楽でいいなと思っていたのですが、bookが変わり、Enterを押すと、とんでもないところに移動してしまう時があるので、少々困惑しています。

  • エクセルでの入力規則と自動入力について

    質問の前に検索をしてみたのですが、 似たようなものが見つからなかったので、質問させてもらいます。 シート2に名前→定義で「登録者名」と作り シート1での入力を入力規則を使い、リスト(コンボボックス) を設定しました。 シート2では 登録者名 会員番号 AAA  1234 BBB  5678 CCC  9101 DDD  1112 と名前の横のセルには会員番号を作っています。 そこで質問ですが、 シート1で登録者名を入力規則のリスト(コンボBOX) で選択して入力した場合、 隣のセルに自動で会員番号が表示できるような関数などは ないでしょうか? VBAなどはできないので、できれば関数でやりたいと思います。 【シート1】    A      B 1 AAA ▼   1234(←この1234を自動で表示させたい) 2     ▼ 3     ▼ 説明不足かも知れませんが教えてください。 よろしくお願いします。 エクセル2003です。