keybd_event が急に使えなくなりました!!!

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
splash
記事: 16
登録日時: 11年前

keybd_event が急に使えなくなりました!!!

#1

投稿記事 by splash » 11年前

キー操作をするAPIのkeybd_eventが昨日まで問題なく使えていたのですが、いきなり使えなくなりました。
今日したことといえば、XAMPPというソフトを再インストールしたことぐらいです。
特に環境設定を変えたりはしていません。

開発環境はVisual Studio2013 C++ Windowsフォームアプリケーション Windows7 64bitです。

具体的にいうと、コンパイルは通って実行もできるのですが操作したいキーとは違うキー(7や;)というキーが押されていたり、何もならなかったりします。
ソースはいじってないので、昨日と変わっていないはずです。
1つ気になるのはVisual Studioの下の出力のところに、大量にファイルが開けていないとでていることです。
昨日はこんなに開けないファイルが出ていなかった気がします。
http://gyazo.com/5aa21057482e135033fa8b3ecd637d92
http://gyazo.com/d1775054f947f85187b35c728b694eb4

NET Frameworkの修復なども試してみましたが、ダメでした。

sql

Re: keybd_event が急に使えなくなりました!!!

#2

投稿記事 by sql » 11年前

以下の操作をしてプロジェクトが吹っ飛んでも自己責任でお願いします。(不安でしたら他のもっと詳しい方の回答を優先してください)

たしかデバッグ、リリースファイルのどちらか、今ビルドしている方のフォルダ内にPDBファイルがあると思うのでそれを一旦削除、そしてもう一回ビルドする。(おそらくなかったはずのPDBファイルが出現している)(VS2013は詳しくないですが)
バックアップを取っておいたほうがいいですね。

splash
記事: 16
登録日時: 11年前

Re: keybd_event が急に使えなくなりました!!!

#3

投稿記事 by splash » 11年前

sqlさん回答ありがとうございます。

今ビルドしているフォルダ内というとプロジェクトを作成した時に作られる普通のフォルダでいいんですよね?
そこの中を探しましたがPDBファイルが1つもありませんでした。
たぶんこれが原因でしょうね・・・・・・
どうしようもないので、新しいプロジェクトを作りソースだけコピペしてやってみたのですが、それでも同じようにPDBファイルが開けないみたいです・・・・

初心者なもので、これ以上どうすればいいかほんとにわかりません、どなたか同じような経験がる方助けてください!

あ、・・・・あれ?!  keybd_eventこれ関連のコードを全部消してもPDBファイルが開けないという出力がたくさんでますね。。。。
てっきり、keybd_event消したら開けないPDBファイルを開く必要がなくなるのかと思ってたんですが・・・・
PDBが開けないってでていても、他のコードはちゃんと実行できているのでもしかしたらPDBが原因じゃないかもしれないです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: keybd_event が急に使えなくなりました!!!

#4

投稿記事 by softya(ソフト屋) » 11年前

keybd_eventって.NET系の関数ですよね? と言うことはC++/CLIのフォームアプリケーションとして開発されていますか?
この場合は、C/C++と系列が違うのでpdbを使わないのかもしれません(詳しくないです)。
現象を再現する最低限のソースコードと、プロジェクトを新規作成した手続きを詳細に説明されるとちゃんとした回答がつくと思います。

ちなみにPDBファイルが開けませんと大量に出るのは仕様で気にしなくてよいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sql

Re: keybd_event が急に使えなくなりました!!!

#5

投稿記事 by sql » 11年前

splash さんが書きました:あ、・・・・あれ?!  keybd_eventこれ関連のコードを全部消してもPDBファイルが開けないという出力がたくさんでますね。。。。
てっきり、keybd_event消したら開けないPDBファイルを開く必要がなくなるのかと思ってたんですが・・・・
PDBが開けないってでていても、他のコードはちゃんと実行できているのでもしかしたらPDBが原因じゃないかもしれないです。
とすると、自分にはわかりません・・・静観いたします。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: keybd_event が急に使えなくなりました!!!

#6

投稿記事 by みけCAT » 11年前

softya(ソフト屋) さんが書きました:keybd_eventって.NET系の関数ですよね? と言うことはC++/CLIのフォームアプリケーションとして開発されていますか?
keybd_event関数は普通のWindows APIにもあります。
ただし、質問者が意図しているのがどのライブラリのkeybd_eventなのかは、私にはわかりません。
http://msdn.microsoft.com/ja-jp/library/cc364822.aspx
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

splash
記事: 16
登録日時: 11年前

Re: keybd_event が急に使えなくなりました!!!

#7

投稿記事 by splash » 11年前

ソフト屋さん回答ありがとうございます。

C++/CLIで空のプロジェクトを作成したあと、プロジェクト⇒新しい項目の追加⇒Windowsフォームの順番でプロジェクトを作っています。

その際、そのままコンパイルするとエントリーポイントがどうたらこうたらとうエラーが出るので、新しい項目の追加からC++ファイルを追加してそこに

コード:

#include "MyForm.h" // "MyForm" の部分は作成したフォーム名に合わせる

using namespace Project1; // FormApplication1 の部分は作成したプロジェクト名に合わせる

[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
	Application::EnableVisualStyles();
	Application::SetCompatibleTextRenderingDefault(false);
	Application::Run(gcnew MyForm()); // MyForm() の部分は作成したフォーム名に合わせる
	return 0;
}

このコードを書いてコンパイルしています。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: keybd_event が急に使えなくなりました!!!

#8

投稿記事 by softya(ソフト屋) » 11年前

keybd_eventが使われていないので、エラーの出るkeybd_eventの部分の最低限のソースコードを付けてもらえますか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

splash
記事: 16
登録日時: 11年前

Re: keybd_event が急に使えなくなりました!!!

#9

投稿記事 by splash » 11年前

みけCATさん回答ありがとうございます。

どのライブラリでもいいのですが、私が使ったAPIは恐らくhttp://msdn.microsoft.com/ja-jp/library/cc364822.aspxだと思います。
↓のように定義しています。

コード:


      [DllImport("USER32.dll")]
			static void keybd_event(int vvkey);


splash
記事: 16
登録日時: 11年前

Re: keybd_event が急に使えなくなりました!!!

#10

投稿記事 by splash » 11年前

ソフト屋さん2回目の回答ありがとうございます。
softya(ソフト屋) さんが書きました:keybd_eventが使われていないので、エラーの出るkeybd_eventの部分の最低限のソースコードを付けてもらえますか。

コード:

#pragma once
#define VK_q 0x51        
#define VK_1 0x31      
#define VK_2 0x32

//↑で仮装キーコード書いて
 if (keyhukku){

						 if (GetAsyncKeyState(VK_q) & 0x8000){

							 if (Qkey == 1){

								 keybd_event(VK_1);


								 Qkey = 0;
							 }
							 else {

								
								 keybd_event(VK_2);

								 Qkey = 1;
//この条件判定で keybd_eventを使っています。



アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: keybd_event が急に使えなくなりました!!!

#11

投稿記事 by みけCAT » 11年前

splash さんが書きました:どのライブラリでもいいのですが、私が使ったAPIは恐らくhttp://msdn.microsoft.com/ja-jp/library/cc364822.aspxだと思います。
↓のように定義しています。

コード:


      [DllImport("USER32.dll")]
			static void keybd_event(int vvkey);

その関数だとしたら、宣言の引数の数が足りていません。
不都合の原因になりそうな気がするので、正しい引数で宣言し、使用してみることをおすすめします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: keybd_event が急に使えなくなりました!!!

#12

投稿記事 by softya(ソフト屋) » 11年前

.NETじゃなくWin32APIのkeybd_eventを呼び出しているんですね。
この書き方で良いのか、C++/CLIはさっぱりわからない私ですがC#の方が情報が多いみたいです。
C++/CLIに拘らないならC#を使われたほうが楽に成れるかもしれません。
C++/CLIのフォームに関しては将来性が余りに不透明です。
「VS2012のVC++でのwindowsフォームアプリケーションの作り方」
http://social.msdn.microsoft.com/Forums ... cgeneralja

それとも前にこの話をしましたっけ?

【補足】
C++/CLIなんだから、マネージドではなくこういう風に呼び出せないのだろうか?試してませんけど。
「Waiting for UFO: c++/cli win32 api呼び出し方法」
http://jdr2009.blogspot.jp/2013/01/ccli-win32-api.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

splash
記事: 16
登録日時: 11年前

Re: keybd_event が急に使えなくなりました!!!

#13

投稿記事 by splash » 11年前

回答ありがとうございます。

う~んわからない・・・・

コード:


[DllImport("User32.dll")]
			static short GetAsyncKeyState(int vKey);
↑のAPIが使えてるので、Waiting for UFO: c++/cli win32 api呼び出し方法これをやらなくてもいいと思うのですが・・・・
とりあえずソフト屋さんがいったとおりC#でやってみようと思い、C#でキー操作するDLLを作ってみたのですが・・・できないですね~。

コード:

 [DllImport("USER32.dll", CallingConvention = CallingConvention.StdCall)]
        static extern void keybd_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);




        private const int VK_5 = 0x35;
        private const int VK_6 = 0x36;
       


 public static void Kyehukku()
        {
            keybd_event(VK_5, 0, 0, 0, 0);
        }

        public static void kyehukku2()
        {
            keybd_event(VK_6, 0, 0, 0, 0);
        }
↑のDLLをC++の方で↓の感じで呼び出しています。

コード:

 if (keyhukku){

						 if (GetAsyncKeyState(VK_q) & 0x8000){

							 if (Qkey == 1){

								 Hack2 keyhukku();


								 Qkey = 0;
							 }
							 else {

								
								 Hack2 keyhukku2();

								 Qkey = 1;

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: keybd_event が急に使えなくなりました!!!

#14

投稿記事 by みけCAT » 11年前

splash さんが書きました:

コード:

 [DllImport("USER32.dll", CallingConvention = CallingConvention.StdCall)]
        static extern void keybd_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
その引数はmouse_event関数と間違えてないですか?
http://msdn.microsoft.com/ja-jp/library/cc410921.aspx
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

splash
記事: 16
登録日時: 11年前

Re: keybd_event が急に使えなくなりました!!!

#15

投稿記事 by splash » 11年前

ご指摘ありがとうございます。
以下のようにコードよ書き換えました。
しかし、結果は変わらず、実行しても何も入力操作がされません。

コード:


[DllImport("USER32.dll", CallingConvention = CallingConvention.StdCall)]
        static extern void keybd_event(int bVk, int bScan, int dwFlags, int dwExtraInfo);



        public static void Kyehukku()
        {
            keybd_event(VK_5, 0, 0, 0);
                     
        }

        public static void kyehukku2()
        {
            keybd_event(VK_6, 0, 0, 0);
        }


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: keybd_event が急に使えなくなりました!!!

#16

投稿記事 by softya(ソフト屋) » 11年前

Windows7 64bitだとkeybd_eventが使えないかもしれません。MSDNに書いてある通りSendInputを使えということみたいです。
「64 bit 版での SendInput では SHIFTキーを送れない?」
http://social.msdn.microsoft.com/Forums ... ntissuesja
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

splash
記事: 16
登録日時: 11年前

Re: keybd_event が急に使えなくなりました!!!

#17

投稿記事 by splash » 11年前

ちょっと、意味がわからないことになってて返信遅れましたm(_ _)m

あれから、SendInputを使おうと思い、コードを書いていたのですが初心者の私にはSendInput意外と難しく・・・・・・

何度もkeybd_eventが使えたらすぐ解決するのにな~~~~と思ってました。
そして、パソコンを一度初期化してみることにしました。
するとなぜか簡単にkeybd_eventが使えるようになってしまいました・・・・
今までこのフォームで色々質問しきた意味はなんだったんでしょうね(´Д`)ハァ…
まぁ、とにかく無事キー入力ができるようになったので、解決としたいと思います。

実は、C言語なんでも質問掲示板を利用したのは初めてだったのですが、皆さん丁寧でしかもすぐに返信してく頂き、とても使いやすかったです。ありがとうございました
また、色々困ったときなどにここを利用させてもらおうと思いますので、どうぞよろしくお願いいたします。

閉鎖

“C言語何でも質問掲示板” へ戻る