
Visual Studio 2015を使用しています。
OSはWindows10です。
SendInputを使用してプログラムを作ろうとしているのですが、うまくいかず、
サイトhttp://pgcenter.web.fc2.com/contents/csharp_send …
のサンプルを基に(そのままに近いですが)動作を確認しながら作っていこうとしています。
Any CPUではなく86でコンパイルし、エディタソフト起動(このソフトに「A」を出力)、アプリを起動して、ボタンをクリックしてもエディタには何も出力されません。
どこか間違っていますか?
(Form1.csは字数の関係で補足に記述します)
No.2ベストアンサー
- 回答日時:
Windows10 64Bit
VS2015 community
で、掲示されたページのものをコピペ。
プロジェクトをWindowsフォームアプリケーションで作成したので
正確にはちょっと違いますが。
using System.Runtime.InteropServices;
をコピぺ。
// マウスイベント(mouse_eventの引数と同様のデータ)
から
private const int VK_SHIFT = 0x10; // SHIFTキー
までをコンストラクタの上にコピペ。
フォームにボタンコントロールを配置してClickイベントのハンドラを追加。
ハンドラ内にButton1_Click()の中身をコピペ。
AnyCPUのままビルドして実行。
秀丸を起動。
そのまま今回のフォームをクリックしてアクティブ状態を切り替え。
で、ボタン押下で秀丸に"A"が追加されました。
>プロジェクトをWindowsフォームアプリケーションで作成したので
>正確にはちょっと違いますが。
私もWindowsフォームアプリケーションで作成しました。
ここと同じ手順で実行(debug、release両方で、 開始ボタンで実行)しましたが、秀丸には何も表示されません。
AnyCPUでビルドしています。
フォームのボタンを押すとエディタ(秀丸)が一瞬色が濃くなり、アクティブになっているようです。
No.4
- 回答日時:
>ここと同じ手順で実行(debug、release両方で、 開始ボタンで実行)しましたが、秀丸には何も表示されません。
「開始ボタンで実行」した後、エディタをアクティブ→アプリをアクティブ→ボタン押下…
ですよね?
>フォームのボタンを押すとエディタ(秀丸)が一瞬色が濃くなり、アクティブになっているようです。
私の方で動作確認した時は、「フォームが消えている間」は秀丸がアクティブでしたね。
VS2015で妙なところにブレークポイント貼っていたりした場合はその限りではないでしょうが…。
No.3
- 回答日時:
>エディタソフト起動(このソフトに「A」を出力)、アプリを起動して、ボタンをクリック
この順番だったとしたらエディタには入力されないかと。
1)エディタ起動(入力先ががエディタに切り替わる)
2)VS2015をアクティブに切り替え(入力先がVS2015に切り替わる)
3)F5キーかメニュー操作かコマンドボタンでアプリを起動(入力先がアプリに切り替わる)
4)ボタンをクリック(this.Visible = falseにより、アプリのフォームが一時的に消えてアプリの前にアクティブだったVS2015に入力先が切り替わる)
5)SendInput()によりキーボード入力を実施(VS2015の入力フォーカスによるのでどこに入るかは不明 3)の時の状態次第)
6)this.Visible = trueによりフォームを再表示。ボタンクリックの状態なので入力フォーカスはボタンに設定。
アプリの起動がエクスプローラのexeファイルのダブルクリックだった場合はエクスプローラに入力が送られます。
exeファイルのあるフォルダにaから始まるフォルダ/ファイルがなければエクスプローラは無視するだけでしょう。
# a.txtとかあれば選択状態がexeからa.txtに切り替わると思われます。
SendInputだと共有リソースであるマウスやキーボードの操作をエミュレーションしますので状態によっては期待動作しない可能性があることには気を付けた方がいいでしょう。
# UACやファイル削除確認のダイアログにも送れるんですかねぇ?
ありがとうございます。
新しくプロジェクトを作り直し、No.2に書かれていた通りにしたところ「A」の文字が秀丸に入力されました。
たぶん、キーボードの部分しか使わないので、それ以外のコードを消してしまったことが原因のようです。
重要な部分が解決できたので大いに助かりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- デスクトップパソコン ん~…分からん 7 2022/06/10 10:47
- CAD・DTP 「機能ブロック図」の描画用フリーソフトを教えてください 1 2022/09/23 16:12
- Java EclipseとVisual StudioをPC1台にインストールしただけではPCは重くならない? 3 2022/12/08 15:35
- Windows 10 windows10まで進めない 4 2022/07/23 01:13
- ビデオカード・サウンドカード PCに接続したイヤフォンのマイクが使えません。 3 2022/10/22 11:07
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
- システム パソコンのソフト削除について。 DELL Vostro3561+Windows10を使ってます。(5 3 2022/09/30 11:15
- Windows 10 Windows10でセーフモードが出来ません。 2 2022/04/22 23:37
- CPU・メモリ・マザーボード パソコン動作遅いです。スペックは、2014年に買った dell i54460 tg705 メモリー8 11 2023/04/06 10:05
- 防犯カメラ・監視カメラ・小型カメラ Windowsのカメラ機能。設定した通りのfpsでの撮影ができず、コマ落ち動画になる。修正するには? 2 2023/01/29 09:50
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA シートのボタン名を変更し...
-
VBA(エクセル)で自動的にボタン...
-
VBAで多数のプログラムを一つの...
-
C#プログラムで、ボタンをショ...
-
コマンドボタンやイメージにマ...
-
チェックボックスで指定出来る...
-
VBA CommandButtonの文字ずれ
-
ユーザーフォームに別シートか...
-
閉じると「+」になり開くと「-...
-
Vba 電卓 一文字消すボタン
-
フォームの再読み込み
-
左クリックさせるプログラム
-
Access VBA でデータペーストを...
-
C#でSendInputを使ったサンプル...
-
ボタンの枠線の様なものを消したい
-
[VB.net] ボタン(Flat)のEnable...
-
表示テキストを保存するには
-
オプションボタンについて
-
わかりません
-
ASP.Net ラベルの内容をすぐに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA シートのボタン名を変更し...
-
VBA(エクセル)で自動的にボタン...
-
ユーザーフォームに別シートか...
-
セルをマクロのボタンにしたい。
-
VBA CommandButtonの文字ずれ
-
Excel VBA Application.caller...
-
C#プログラムで、ボタンをショ...
-
フォームの再読み込み
-
コマンドボタンやイメージにマ...
-
[VB.net] ボタン(Flat)のEnable...
-
Excel マクロ 閉じるボタン
-
VBAで多数のプログラムを一つの...
-
ボタンをマウスで押し続けたと...
-
VB.net でトグルボタンを実現し...
-
プロシージャからイベントをコ...
-
アイコンとボタンの違い
-
VBAのボタンの位置が変わって困...
-
閉じると「+」になり開くと「-...
-
[Excel VBA]コマンドボタンの入...
-
ASP.Net ラベルの内容をすぐに...
おすすめ情報
using System.Runtime.InteropServices;他のusingは省略
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
//
[StructLayout(LayoutKind.Sequential)]
private struct KEYBDINPUT
{
public short wVk;
public short wScan;
public int dwFlags;
public int time;
public int dwExtraInfo;
};
// 各種イベント(SendInputの引数データ)
[StructLayout(LayoutKind.Explicit)]
private struct INPUT
{
[FieldOffset(0)]
public int type;
[FieldOffset(4)]
public MOUSEINPUT mi;
[FieldOffset(4)]
public KEYBDINPUT ki;
[FieldOffset(4)]
public HARDWAREINPUT hi;
};
// キー操作、マウス操作をシミュレート(擬似的に操作する)
[DllImport("user32.dll")]
private extern static void SendInput(
int nInputs, ref INPUT pInputs, int cbsize);
// 仮想キーコードをスキャンコードに変換
[DllImport("user32.dll", EntryPoint = "MapVirtualKeyA")]
private extern static int MapVirtualKey(
int wCode, int wMapType);
private const int KEYEVENTF_KEYDOWN = 0x0; // キーを押す
private const int KEYEVENTF_KEYUP = 0x2; // キーを離す
private const int KEYEVENTF_EXTENDEDKEY = 0x1; // 拡張コード
private const int VK_SHIFT = 0x10; // SHIFTキー
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// 自ウインドウを非表示(キーボード操作対象のウィンドウへフォーカスを移動するため)
this.Visible = false;
// キーボード操作実行用のデータ
const int num = 4;
INPUT[] inp = new INPUT[num];
// (1)キーボード(SHIFT)を押す
inp[0].type = INPUT_KEYBOARD;
inp[0].ki.wVk = VK_SHIFT;
inp[0].ki.wScan = (short)MapVirtualKey(inp[0].ki.wVk, 0);
inp[0].ki.dwFlags = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYDOWN;
inp[0].ki.dwExtraInfo = 0;
inp[0].ki.time = 0;
// (2)キーボード(A)を押す
inp[1].type = INPUT_KEYBOARD;
inp[1].ki.wVk = (short)Keys.A;
inp[1].ki.wScan = (short)MapVirtualKey(inp[1].ki.wVk, 0);
inp[1].ki.dwFlags = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYDOWN;
inp[1].ki.dwExtraInfo = 0;
inp[1].ki.time = 0;
// (3)キーボード(A)を離す
inp[2].type = INPUT_KEYBOARD;
inp[2].ki.wVk = (short)Keys.A;
inp[2].ki.wScan = (short)MapVirtualKey(inp[2].ki.wVk, 0);
inp[2].ki.dwFlags = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP;
inp[2].ki.dwExtraInfo = 0;
inp[2].ki.time = 0;
// (4)キーボード(SHIFT)を離す
inp[3].type = INPUT_KEYBOARD;
inp[3].ki.wVk = VK_SHIFT;
inp[3].ki.wScan = (short)MapVirtualKey(inp[3].ki.wVk, 0);
inp[3].ki.dwFlags = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP;
inp[3].ki.dwExtraInfo = 0;
inp[3].ki.time = 0;
// キーボード操作実行
SendInput(num, ref inp[0], Marshal.SizeOf(inp[0]));
// 1000ミリ秒スリープ
System.Threading.Thread.Sleep(1000);
// 自ウインドウを表示
this.Visible = true;
}
}
}