C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: keybd_eventについて


(過去ログ 89 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■53044 / inTopicNo.1)  keybd_eventについて
  
□投稿者/ りーあ (17回)-(2010/09/02(Thu) 09:05:41)

分類:[C#] 

お世話になってます。りーあです。
C#でのkeybd_eventについて質問します。

public class win32api
{
[DllImport("user32.dll")]
public static extern uint keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);
}

これを最初に書いてあります。
Windowsキーを押下した場合のコードの書き方がわかりません・・・
0x5Bが左Windowsキー
0x5Cが右Windowsキーというのは調べました。
どちらでもいいのかと思い、
win32api.keybd_event((byte)0x5B, 0, 0, 0);
というコードにしました。
これで正しいのでしょうか?

この記述をするとデバックの際は
エラーが出ません。
ですが、実行エラーとして

PInvoke DLL 'user32.dll' が見つかりませんでした。

と出てしまいます。
これは何が原因なのでしょうか?
引用返信 編集キー/
■53048 / inTopicNo.2)  Re[1]: keybd_eventについて
□投稿者/ よねKEN (597回)-(2010/09/02(Thu) 09:54:07)
よねKEN さんの Web サイト
> PInvoke DLL 'user32.dll' が見つかりませんでした。
>
> と出てしまいます。
> これは何が原因なのでしょうか?

実行環境(OSなど)を明示してください。
通常のWindowsならその宣言で問題はないはずですが、
エラーの出方からすると実行環境はWindowsMobileなのでは?
そうであれば、以下が参考になると思います。

キーイベントを発行したい - モバイル・スマートクライアント
http://vsug.jp/tabid/63/forumid/50/threadid/4990/scope/posts/Default.aspx

#user32.dll→coredll.dllに変更すべし、という内容です。

引用返信 編集キー/
■53049 / inTopicNo.3)  Re[2]: keybd_eventについて
□投稿者/ よねKEN (598回)-(2010/09/02(Thu) 10:00:20)
よねKEN さんの Web サイト
2010/09/02(Thu) 10:11:55 編集(投稿者)

補足です。
No53048 (よねKEN さん) に返信
> エラーの出方からすると実行環境はWindowsMobileなのでは?

これが正しい場合ですが、WindowsAPIは実行環境によって宣言も使い方も微妙に違う場合があるので、
MSDNライブラリで使用方法などを確認してください。

keybd_event(Windows Mobile 6.5向け(Windows Embedded CE 6.0 R3も可))
http://msdn.microsoft.com/en-us/library/aa928103.aspx
引用返信 編集キー/
■53051 / inTopicNo.4)  Re[2]: keybd_eventについて
□投稿者/ りーあ (19回)-(2010/09/02(Thu) 10:26:19)
よねKENさんありがとうございます。

> 実行環境(OSなど)を明示してください。
> 通常のWindowsならその宣言で問題はないはずですが、
> エラーの出方からすると実行環境はWindowsMobileなのでは?

実行環境は、Windows CE 6.0 R3です。

> #user32.dll→coredll.dllに変更すべし、という内容です。

この記述に直したところ実行エラーは
出なくなりました。
ありがとうございました。

ですが、なぜか表示がされません・・・
根本的なところから・・・
Buttonクリックで、Windowsキーを押下した場合と
同じ状況を作りたいのですが
keybd_eventでいいのでしょうか?
引用返信 編集キー/
■53052 / inTopicNo.5)  Re[3]: keybd_eventについて
□投稿者/ りーあ (21回)-(2010/09/02(Thu) 10:30:57)
よねKEN さんありがとうございます

> keybd_event(Windows Mobile 6.5向け(Windows Embedded CE 6.0 R3も可))
> http://msdn.microsoft.com/en-us/library/aa928103.aspx

ここから

public class win32api
{
[DllImport("coredll.dll")]
public static extern uint keybd_event(byte bVk, byte bScan, DWORD dwFlags, DWORD dwExtraInfo);
}

このような書き方にしてみました。
解釈の仕方が間違っているのでしょうか・・・

型または名前空間名 'DWORD' が見つかりませんでした。
using ディレクティブまたはアセンブリ参照が不足しています。

というエラーが出てしまいました。
引用返信 編集キー/
■53056 / inTopicNo.6)  Re[3]: keybd_eventについて
□投稿者/ よねKEN (599回)-(2010/09/02(Thu) 11:42:23)
よねKEN さんの Web サイト
質問文には書かれていませんが、「スタート」メニューを表示するのが目的でしょうか?
#WindowsCEのことはわからないので、WindowsCEでのWindowsキー押下も同じかは知りませんが

> ですが、なぜか表示がされません・・・

自分のパソコンで実際に「Windowsキー」を押してみてください。
スタートメニューは表示されますか?表示されないはずです。

少なくとも私のところでは「Windowsキー」を離したときに表示されました。

> Buttonクリックで、Windowsキーを押下した場合と
> 同じ状況を作りたいのですが
> keybd_eventでいいのでしょうか?

おそらく「押す」ことはできていると思うのですが「離す」ができていないと思います。

> public class win32api
> {
> [DllImport("coredll.dll")]
> public static extern uint keybd_event(byte bVk, byte bScan, DWORD dwFlags, DWORD dwExtraInfo);
> }
>
> このような書き方にしてみました。

MSDNライブラリに掲載されているのは、C言語での定義です。
DWORD型は32bit符号なし整数ですので(少なくともモバイルじゃないWindowsでは)、
uint型が妥当だと思います。
それから戻り値がなぜかuint型になっていますが、
keybd_eventの戻り値はモバイル版でもそうでなくてもvoidですよ。

後、dwFlagsに対して実引数を渡すときにWindowsキーの押す/離すときには、
KEYEVETF_EXTENDEDKEYをOrで指定する必要もあるかも、という気がします。(あまり確証はありません)

#私のところのモバイルでない環境で実験した限りでは、
#KEYEVETF_EXTENDEDKEYを指定に含めても含めなくても動作はしましたが。
引用返信 編集キー/
■53057 / inTopicNo.7)  Re[4]: keybd_eventについて
□投稿者/ よねKEN (600回)-(2010/09/02(Thu) 11:52:48)
よねKEN さんの Web サイト
連投すみません。
りーあさん、これを見てちょっと実験してみようとされる方へ。

> #私のところのモバイルでない環境で実験した限りでは、
> #KEYEVETF_EXTENDEDKEYを指定に含めても含めなくても動作はしましたが。

この実験をしたときに、困ったことですが、

win32api.keybd_event((byte)0x5B, 0, 0, 0);

という内容だけを実行してしまうとWindowsキーが押しっぱなし状態になって、
KEYUPのための修正版のコードも実行しないと、それまではWindowsキー押しっぱなし状態になりますので、
実験される方はご注意ください。

戻り値のuintをvoidに直そうとして、「voi」まで打った後、「d」を打つと
入力されずに、「Win + D」の効果が発動しました(笑)
別のテキストにあった「d」をコピペして回避して、KEYUPさせるコードを書いて解決しました。
引用返信 編集キー/
■53058 / inTopicNo.8)  Re[4]: keybd_eventについて
□投稿者/ りーあ (23回)-(2010/09/02(Thu) 12:08:27)
よねKEN さんありがとうございます。

> 質問文には書かれていませんが、「スタート」メニューを表示するのが目的でしょうか?
そうです。説明不足で申し訳ありません。

> おそらく「押す」ことはできていると思うのですが「離す」ができていないと思います。
「離す」ということは、
win32api.keybd_event((byte)0x5B, 0, 2/*KEYEVENTF_KEYUP*/, 0);
このコードで正しいでしょうか?

> MSDNライブラリに掲載されているのは、C言語での定義です。
> DWORD型は32bit符号なし整数ですので(少なくともモバイルじゃないWindowsでは)、
> uint型が妥当だと思います。
public class win32api
{
[DllImport("coredll.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, ref uint dwExtraInfo);
}
いろいろ調べてみてこのようになりました。
dwExtraInfoはref uint型でいいのでしょうか?

>それから戻り値がなぜかuint型になっていますが、
>keybd_eventの戻り値はモバイル版でもそうでなくてもvoidですよ。
ネットからコピーしたので・・・voidに修正しておきました。
ありがとうございます。

>win32api.keybd_event((byte)0x5B, 0, 0, 0);
>という内容だけを実行してしまうとWindowsキーが押しっぱなし状態になって、
>KEYUPのための修正版のコードも実行しないと、それまではWindowsキー押しっぱなし状態になりますので、
>実験される方はご注意ください。
ということなんですが、
修正版のコードも実行とはどういうことでしょうか?


何度も申し訳ありません。
よろしくお願い致します。
引用返信 編集キー/
■53062 / inTopicNo.9)  Re[5]: keybd_eventについて
□投稿者/ りーあ (25回)-(2010/09/02(Thu) 13:25:00)
private void button1_Click(object sender, EventArgs e)
{
uint KEYEVENT_dwExtraInfo = 0;

win32api.keybd_event((byte)0x5B, 0, 0, ref KEYEVENTTF_KEYEX);//Windowsキー
win32api.keybd_event((byte)0x5B, 0, 2/*KEYEVENTF_KEYUP*/, ref KEYEVENTTF_dwExtraInfo);
Thread.Sleep(10);
}

この書き方で「スタート」メニューを開くことが出来ました。
ありがとうございました。
解決済み
引用返信 編集キー/
■53081 / inTopicNo.10)  Re[5]: keybd_eventについて
□投稿者/ よねKEN (601回)-(2010/09/02(Thu) 17:16:33)
よねKEN さんの Web サイト
2010/09/02(Thu) 17:17:26 編集(投稿者)

No53058 (りーあ さん) に返信
>>MSDNライブラリに掲載されているのは、C言語での定義です。
>>DWORD型は32bit符号なし整数ですので(少なくともモバイルじゃないWindowsでは)、
>>uint型が妥当だと思います。
> public class win32api
> {
> [DllImport("coredll.dll")]
> public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, ref uint dwExtraInfo);
> }
> いろいろ調べてみてこのようになりました。
> dwExtraInfoはref uint型でいいのでしょうか?

元がDWORDですので、refなしのただのuint型が適切です。
uint型(32bit符号なし整数)の代わりにintでもuintでもIntPtrでもref uintでも、
32bit環境ではどの型もメモリ上は単なる32bit長の領域であるため、結果的に問題が起きないだけです。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -