アプリ版:「スタンプのみでお礼する」機能のリリースについて

SendInput()関数を使ってキーを自動入力することに
関して質問したばかりなのですが、

当方のWin XP PRO SP2の場合使うことはできないのでしょうか?
(MDSNにはNT SP4以降と書いてありました。)

この場合は古い関数か何かがあるのでしょうか?

ちなみにそのPCでデバッグをかけると
 lpKey は定義されていない」
というエラーをはじめ変数がほとんどはじかれます。

A 回答 (6件)

★アドバイス


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

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

お礼日時:2008/05/19 18:28

★アドバイス


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

この回答への補足

ありがとうございます。まだ自動入力動作自体は
できておりませんが、
お陰様でとりあえずエラーは出なくなりました。

度々すみません。もう一点お伺いしたいのですが、
頂いたサンプルプログラムの
if ( SendInput((UINT)(lpKey - Key),Key,sizeof(INPUT)) == (UINT)(lpKey - Key) ){
 正常
}
else{
 エラー
}
の部分をなくしても
setKeybrd( lpKey++, 'S', TRUE );
setKeybrd( lpKey++, 'S', FALSE );
の部分までで、キー入力されたことになっているのでしょうか?

おそらく私の使用しているプログラム自体に
問題があるのですが、上記のやり方で
実行しても「S」の自動入力がされていないみたいでして。

補足日時:2008/05/18 23:23
    • good
    • 0

> error C3872: '0x3000': この文字を識別子で使用することはできません


全角空白が混じっているので削除してください。
    • good
    • 0

★補足要求です。


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

この回答への補足

すみません。#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: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)

補足日時:2008/05/17 23:59
    • good
    • 0

★前回回答した者です。


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

この回答への補足

お世話なります。
実は知人のプログラムベースでコピペをしたら
動いたのですが、私のプログラムにそれを写したところ
エラーが出てしまいました。
変数の宣言・ヘッダのインクルードなどはまったくしていないのですがこれが原因なのでしょうか?
ちなみにプログラムはほぼそのまま

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”を押すと実行する既存のプログラム
}

といった感じで使わせてもらっております。

補足日時:2008/05/17 21:28
    • good
    • 0

実行時エラーですか?


ビルド時のエラーですか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!