質問 |
||
| QNo.4027968 | VC++の自動キー入力プログラム | |
|---|---|---|
| 質問者:rairarai |
SendInput()関数を使ってキーを自動入力することに 関して質問したばかりなのですが、 当方のWin XP PRO SP2の場合使うことはできないのでしょうか? (MDSNにはNT SP4以降と書いてありました。) この場合は古い関数か何かがあるのでしょうか? ちなみにそのPCでデバッグをかけると lpKey は定義されていない」 というエラーをはじめ変数がほとんどはじかれます。 |
|
困り度:
|
||
| 質問投稿日時: 08/05/17 00:41 |
||
回答良回答20pt |
|
| ANo.6 | ★アドバイス >の部分までで、キー入力されたことになっているのでしょうか? ↑ いいえキー入力されたことにはなりません。 単にINPUT構造体にデータをセットしただけです。 SendInput()関数を実行して初めて『S』キーが押されたのと同じになります。 ・SendInput()関数の戻り値を調べてみましたか? ifで分岐して正常、エラーのどちらが表示されますか? MessageBox()などで確認して下さい。 エラーならINPUT構造体のセット内容の不正かも知れません。 私の載せたサンプルは『マルチバイト文字』を想定した書き方です。 オプション設定で『Unicode文字』を使う設定ですか? |
|---|---|
| 回答者:Oh-Orange | |
| 種類:アドバイス どんな人:専門家 自信:参考意見 |
|
| 回答日時: 08/05/19 17:42 |
|
| |
| この回答へのお礼 | SendInput()関数を入れたら問題なく作動しました。 とんちんかんな事聞きましてすみません。 ありがとうございました。 |
回答 |
|
| ANo.5 | ★アドバイス 回答者No.4さんのアドバイス通りでしょう。 前回の質問でサンプルを載せましたがインデントを全角空白で書いています。 タブ文字だとインデントがなくなるためです。 よってサンプル・ソースでインデントされていれば全角空白だと考え 今後コピー&ペーストするときにタブ文字に修正して下さい。 ※少なくとも私が貼り付けるサンプルは全角空白でインデントしてます。 |
|---|---|
| 回答者:Oh-Orange | |
| 種類:回答 どんな人:専門家 自信:参考意見 |
|
| 回答日時: 08/05/18 02:44 |
|
| |
| この回答への補足 | ありがとうございます。まだ自動入力動作自体は できておりませんが、 お陰様でとりあえずエラーは出なくなりました。 度々すみません。もう一点お伺いしたいのですが、 頂いたサンプルプログラムの if ( SendInput((UINT)(lpKey - Key),Key,sizeof(INPUT)) == (UINT)(lpKey - Key) ){ 正常 } else{ エラー } の部分をなくしても setKeybrd( lpKey++, 'S', TRUE ); setKeybrd( lpKey++, 'S', FALSE ); の部分までで、キー入力されたことになっているのでしょうか? おそらく私の使用しているプログラム自体に 問題があるのですが、上記のやり方で 実行しても「S」の自動入力がされていないみたいでして。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答良回答10pt |
|
| ANo.4 | > error C3872: '0x3000': この文字を識別子で使用することはできません 全角空白が混じっているので削除してください。 |
|---|---|
| 回答者:Werner | |
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/05/18 01:32 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.3 | ★補足要求です。 >変数の宣言・ヘッダのインクルードなどはまったくしていないのですがこれが原因なのでしょうか? ↑ 『windows.h』はインクルードしていますか? これがないとINPUTやLPINPUT型でエラーになります。 インクルードしていないのならば #include<windows.h> を1行追加して下さい。 ・これ以外が原因ならば全ソースを貼り付けるか、エラー内容を貼り付けて下さい。 |
|---|---|
| 回答者:Oh-Orange | |
| 種類:補足要求 どんな人:専門家 自信:参考意見 |
|
| 回答日時: 08/05/17 23:06 |
|
| |
| この回答への補足 | すみません。#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: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?) |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.2 | ★前回回答した者です。 ・こちらの環境は Windows XP SP2 です。 ちゃんと動作しています。 よってソースの記述に誤りがありそうな気がします。 補足にソースを貼り付けてみて下さい。 もしかしたら解決するかもしれません。 >(MDSNにはNT SP4以降と書いてありました。) こう書かれているのならば Windows NT SP4 Windows 2000 Windows XP Windows Vista でも使用可能という意味です。 |
|---|---|
| 回答者:Oh-Orange | |
| 種類:補足要求 どんな人:専門家 自信:参考意見 |
|
| 回答日時: 08/05/17 12:46 |
|
| |
| この回答への補足 | お世話なります。 実は知人のプログラムベースでコピペをしたら 動いたのですが、私のプログラムにそれを写したところ エラーが出てしまいました。 変数の宣言・ヘッダのインクルードなどはまったくしていないのですがこれが原因なのでしょうか? ちなみにプログラムはほぼそのまま 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”を押すと実行する既存のプログラム } といった感じで使わせてもらっております。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.1 | 実行時エラーですか? ビルド時のエラーですか? |
|---|---|
| 回答者:Wr5 | |
| 種類:補足要求 どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/05/17 00:58 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |