「夫を成功」へ導く妻の秘訣 座談会

C言語(C++・Win32API)にて、擬似的にキーボードの入力ができないか考察しております。

そのまま、キーボードで入力したことと同様な動きはできない物でしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

もっと低レベルでは keybd_event関数を使います。


キーの押し・離しまで仮想的に再現できます。
使い方やサンプルは検索すればたくさん見つかるでしょう。

参考URL:http://www.yoshibaworks.com/ayacy/inasoft/autoke …
    • good
    • 0

SendInputを使えばできます。

    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qキーの自動入力

既存のアプリケーションをスタートするのに、”S”を
押すのですが、これを自動でスタートするように勝手に
”S”を入力するようにするにはどういったプログラムをすればよいのでしょうか?
初歩的な質問かもしれませんが、よろしくお願いします。

Aベストアンサー

★アドバイス
・INPUT構造体にあるKEYBOARDINPUT構造体にいろいろ値をセットします。
 その後にSendInput()関数を呼び出します。

サンプル:

// 標準キーの設定
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;
}

// 使い方([Windows]+[R]の場合)
INPUT Key[ 4 ];
LPINPUT lpKey = Key;

setKeybrd( lpKey++, VK_LWIN, TRUE );
setKeybrd( lpKey++, 'R', TRUE );
setKeybrd( lpKey++, 'R', FALSE );
setKeybrd( lpKey++, VK_LWIN, FALSE );

if ( SendInput((UINT)(lpKey - Key),Key,sizeof(INPUT)) == (UINT)(lpKey - Key) ){
 正常
}
else{
 エラー
}
こんな感じで動くでしょう。
'R'を'S'にしてVK_LWINの行をなくせば良い。

★アドバイス
・INPUT構造体にあるKEYBOARDINPUT構造体にいろいろ値をセットします。
 その後にSendInput()関数を呼び出します。

サンプル:

// 標準キーの設定
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;...続きを読む

Qキー自動入力のサンプルコードを教えてください!

スタートアップで、
1.ブラウザが立ち上がり、
2.自動的にフルブラウザ表示する

パソコンを起動させたら、何もしなくてもフルブラウザで立ち上がるという設定にしたいのです。

スタートアップという機能がwindowsにはあるので、フルブラウザをさせるプログラムを作って、
同様にスタートアップリストに登録すればいいいのかな?
と考えていたのですが、
調べると、VC++によるプログラムを見つけました。

私が知っている言語は、Cとjavaです。
C++もVC++も触ったことがありません。
勉強したいのですが、急な事情で時間がありません。

Cygwinを使ってC,C++のコンパイラや環境設定は完了している状況です。
g++ sanple.cpp
でコンパイルできるソースで上記のようなプログラムが作りたいのです。

そこで、コピするペだけでF11キーを自動入力するプログラムソースを教えていただけませんか?

わがままな質問ですが、よろしくお願いいたします。

Aベストアンサー

> これはなんという技術というか・・・名称のものなんでしょうか?w

コマンド、コマンドプロンプト、コマンドラインなどで起動しています。
スタート→ファイル名を指定して実行
のところでコマンドを入力したら同じことができます。


スタート→ファイル名を指定して実行→cmd
でコマンドプロンプトが開きます。

これらのコマンドをファイルに書いてあとで実行できるようにしたのが、バッチファイルです。拡張子[.bat]
ダブルクリックでも実行できます。



> ちなみに、他のブラウザ(試したのはFireFox)でもフルブラウザにするには、どうすればいいでしょう?
ブラウザごとに、コマンドからどういう起動の仕方ができるかは違います。
"firefox コマンドプロンプト"でぐぐってみたんですが、どうも全画面表示はなさそうですね~

Q一定時間で自動でキーを入力するソフト

更新キーとしてF5を一定時間間隔で押したいんですが
そういったソフトはありますか?間隔の指定もできるソフトで
お願いします

Aベストアンサー

このへんとか
http://www.vector.co.jp/vpack/filearea/win/util/operate/

QEnterキーを押されたら次の処理に移るという事をしたい。

コンソールアプリケーション上で文字列を表示させた後、ユーザーがエンターキーを押したら次の文字列を表示するという仕様にしたいのですが、エンターキーだけ入力待ちにするっていうのはどのように書けばいいんでしょうか?

Aベストアンサー

#include <stdio.h>

int main(void)
{
char *str[] = {"abc", "def", "ghi", "jkl"};
int i;

for(i = 0; i < 4; i ++){
while(getchar() != '\n') ;
puts(str[i]);
}
return 0;
}

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

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

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

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

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

Aベストアンサー

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

Q他のウィンドウのボタンを自動的に押したい

VisualC++で作ったアプリケーションから、例えばWindowsに標準搭載の「電卓アプリケーション」のウィンドウをアクティブにして、さらにその中の「1」ボタンを認識して押す、テキストボックスを認識してそこに文字列を入れるといったソフトを作りたいです。

簡単にいうと、他のアプリケーションを自動的に操作するソフトを作りたいのです。

これを実現するために、Web検索してみましたが、関連する技術の名前やMFCでのAPI名がわからないです。これはどういった名前の技術で、VisualC++でどういった名前の関数を使うのでしょうか?

当方の環境はWindowsXP&VisualC++6.0です。

以上、よろしくお願いします。

Aベストアンサー

★列挙方法のアドバイス
・補足になる仕様の
>(1)ウィンドウのタイトルバーの名前(例:「電卓」)、
>またはウィンドウのIDでウィンドウを探す
 ↑
 これなら FindWindow() 関数でウインドウ・ハンドルを探せます。
 例: HWND hWnd = FindWindow( "SciCalc", "電卓" );
>(2)最初にヒットしたウィンドウをアクティブにする
 ↑
 最初にヒットした hWnd を SetForegroundWindow() 関数でアクティブにします。
 例: SetForegroundWindow( hWnd );
>(3)アクティブにしたウィンドウの中にあるボタンを探す
 ↑
 (1)で取得しているウインドウに対して子ウインドウ(ボタンなど)を列挙します。
 列挙には EnumChildWindows() 関数と EnumChildProc() のコールバック関数を使います。
>(4)「1」のボタン、またはボタンのIDがヒットしたらそのボタンを押す
 ↑
 列挙のコールバック関数(EnumChildProc)でボタンのキャプションを調べて
 『1』となっている文字列が電卓の『1』ボタンです。
 このときにボタンを押す処理をプログラムから行います。
 例: SendMessage( hChild, BM_CLICK, 0, 0 );
 URL: http://wisdom.sakura.ne.jp/system/winapi/win32/win53.html
・上記のような感じで操作できます。
 一番重要なのは操作するウインドウのハンドルを正しく見つけ出すことです。
 このウインドウ・ハンドルを見つけるには次の方法があります。
 (1)FindWindow() 関数を使う
 (2)EnumWindows() 関数を使う
 (3)Process32First()、Process32Next() 関数を使う
 (4)EnumProcesses() 関数を使う
 などがあります。
 今回は簡単な(1)を紹介しました。
 もしもウインドウのクラス名やキャプション名以外で詳しく捜査対象の
 ウインドウを検索するには(2)の EnumWindows() 関数や起動パス名を
 調べて特定できる (3)、(4)の関数群を利用します。
>テキストの内容の認識や保存など色々な機能を盛り込んだソフトを作りたいからです。
 ↑
 ボタンなどのテキストを認識、保存には GetWindowText()、WM_GETTEXT メッセージを
 使います。メッセージの場合は SendMessage() 関数でキャプション文字列を取得します。
 例: SendMessage( hChild, WM_GETTEXT, sizeof(szBuff), szBuff );
・下に簡単なボタンの列挙を載せます。これを活用して下さい。

サンプル:
#include <stdio.h>
#include <windows.h>

// コールバック関数
BOOL CALLBACK EnumChildProc( HWND hWnd, LPARAM lParam )
{
 TCHAR szBuff[ 1024 ];
 
 // キャプションの取得
 GetWindowText( hWnd, szBuff, sizeof(szBuff) );
 printf( "├[%s]\n", szBuff );
 return TRUE;
}

// メイン関数
int main( void )
{
 HWND hCalc;
 
 if ( (hCalc = FindWindow("SciCalc","電卓")) != NULL ){
  printf( "◆電卓のコントロール列挙\n" );
  EnumChildWindows( hCalc, EnumChildProc, NULL );
 }
 return 0;
}
以上。

★列挙方法のアドバイス
・補足になる仕様の
>(1)ウィンドウのタイトルバーの名前(例:「電卓」)、
>またはウィンドウのIDでウィンドウを探す
 ↑
 これなら FindWindow() 関数でウインドウ・ハンドルを探せます。
 例: HWND hWnd = FindWindow( "SciCalc", "電卓" );
>(2)最初にヒットしたウィンドウをアクティブにする
 ↑
 最初にヒットした hWnd を SetForegroundWindow() 関数でアクティブにします。
 例: SetForegroundWindow( hWnd );
>(3)アクティブにしたウィンドウの中にあるボタンを...続きを読む

QC#でキーボードの入力を自動で実行し繰り返すプログラム

タイトルの通りでC#でキーボードの入力を自動で実行し、繰り返すプログラムを作りたいんですが、キーボードの入力を自動で行うプログラムはどう記述すればよいのか分かる方教えて貰えないでしょうか?また、参考サイトなどがあれば教えてください。

ちなみに作りたいプログラムの内容は、
完成したプログラムのボタンを押すと、
F8 → 2秒停止 → Enter → 2秒停止 → Enter
と自動で実行されるみたいな感じです。

分かる方、お願いします。

Aベストアンサー

.Net Frameworkでは確かキーインベントの発生はサポートしていなかったと思うのでWindowsAPIを呼び出します.
くわしくは参考urlのサイトを見てください.

参考URL:http://www.yoshibaworks.com/ayacy/inasoft/autokeyb/chapter3.html

QLinuxプログラミングで、キーボードの値がほしい

Linuxのgccでのプログラミングで、キーボードのどのキーが押されたのかを変数に代入したりして取得したりすることはできないでしょうか?


例えば、while分で永久ループを作っておいて、

while(1)
{

if(aのキーが押されている場合)
printf("A key is pushing!")
elseif(sのキーが押されている場合)
printf("B key is pushing!")
elseif(dのキーが押されている場合)
printf("D key is pushing!")
・・・

}

このようなプログラムを作ることはできないでしょうか?
どうぞ、ご教授の程よろしくお願い致します。

Aベストアンサー

できますが、かなり面倒です。
termiosやncursesなんかを調べて見るといいかも。

QWindows上のマウス操作をプログラムで実現したい(C,C++,C#)

Windows上で、マウスで右クリック→ファイル名をコピー→貼り付け

という動作をプログラミングによって実現したいのですが、どのようにしたら良いのでしょう?
やはり、APIを使うと思うのでC#が適しているかと自分では思っているのですが、CでもC++でもかまいません。
どなたかご教授願えますか?よろしくお願いいたします。

Aベストアンサー

★『ファイル名をコピー』の処理を自分のプログラムに組み込んでみるのはどう?
・もう少しだけ詳しい動作の仕組みを補足要求します。
・また『mouse_event』という API 関数は古いので新しい関数『SendInput』を使いましょう。
・ただし、この『SendInput』関数はマウス以外にキーボードのエミュレートも行えるため
 少しだけ複雑な指定になります。慣れれば何てことないが…。→また紹介します。
・まぁ、とにかくもう少し何を行いたいのかを補足して下さい。
・まさか、本当に『右クリック』→『ファイル名をコピー』→『貼り付け』の3ステップを
 行いたいのですか?

参考URL:http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200412/04120036.txt

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む


人気Q&Aランキング