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

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

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

Re[5]: Sendkeysで^(カレット記号)を送る


(過去ログ 127 を表示中)

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

■75432 / inTopicNo.1)  Sendkeysで^(カレット記号)を送る
  
□投稿者/ Sendkeys (1回)-(2015/03/24(Tue) 23:41:47)

分類:[C#] 

C#2008 Express Edition
.NET Framework 3.5
Windows7/WindowsXP

お世話になります。
Sendkyesで ^ を送ろうと思っていますが、 & がエミュレートされます。


https://msdn.microsoft.com/ja-jp/library/system.windows.forms.sendkeys(v=vs.90).aspx
の解説に記載から、↓
プラス記号 (+)、カレット (^)、パーセント記号 (%)、ティルダ (~)、およびかっこ (( )) は、SendKeys で特別な意味を持ちます。これらの文字の 1 つを指定するには、その文字を中かっこ ({}) で囲みます。



のように、その文字を中かっこ ({}) で囲みましたが & になってしまいます。



------------------(Microsoft.VisualBasic.dll内にあるので,参照の追加)------------------
private void button1_Click(object sender, EventArgs e)
{
Microsoft.VisualBasic.Interaction.AppActivate("メモ帳");
SendKeys.Send("{^}");
}
---------------------------------------------------------------------------------------


SendKeysでカレット (^)を送るにはどのようにしたら良いのでしょうか?
宜しく御願い致します。

引用返信 編集キー/
■75433 / inTopicNo.2)  Re[1]: Sendkeysで^(カレット記号)を送る
□投稿者/ 魔界の仮面弁士 (258回)-(2015/03/25(Wed) 02:33:25)
2015/03/25(Wed) 03:15:52 編集(投稿者)

No75432 (Sendkeys さん) に返信
> https://msdn.microsoft.com/ja-jp/library/system.windows.forms.sendkeys(v=vs.90).aspx
> の解説に記載から、↓
そこには、このような一文も書かれていますね。

》国際対応のアプリケーションでは、Send の使用は避けてください。
》使用されるキーボードの種類が多岐にわたるため、
》予期しない結果が発生する可能性があります。

> Sendkyesで ^ を送ろうと思っていますが、 & がエミュレートされます。

うーむ。Excel VBA の SendKeys だと、『{^}』で良いのですけれどね。

.NET 版の実装はこんな感じだそうで。
http://referencesource.microsoft.com/#q=SendKeys


上記を見ると、
 「%」は [Shift]+[5]
 「^」は「Shift]+[6]
となっています。英語キーボード前提のマッピングのようですね。
https://support.microsoft.com/ja-jp/kb/2569052/


> SendKeysでカレット (^)を送るにはどのようにしたら良いのでしょうか?
ということで、SendKeys 以外の方法を模索した方が良い気もしますが、
今回は SendKeys 前提のようですので、英語キーボードにするしか無さそうですね。

コントロールパネルのテキストサービスで、「英語」をインストールしておき、
あらかじめメモ帳側で、JPキーボードから ENキーボードに変更しておいてください。
これならば、{^} にてカレットが送出されるようになります。

次案としては、行儀の悪いコードになりますが、
 Clipboard.SetText("^", TextDataFormat.UnicodeText);
 SendKeys.SendWait("+{INS}");
とかかな。


あとはメモ帳においては、テンキー側の数字キーを用いて
 『Altを押しながら [Num9][Num4] と打って、Alt を離す』
という操作をすることで「^」が入力されるので、そのキー操作を
真似られないかとも思いましたが、これも SendKeys では無理そうですね。
引用返信 編集キー/
■75434 / inTopicNo.3)  Re[2]: Sendkeysで^(カレット記号)を送る
□投稿者/ Sendkeys (2回)-(2015/03/25(Wed) 07:11:40)
> 》国際対応のアプリケーションでは、Send の使用は避けてください。
> 》使用されるキーボードの種類が多岐にわたるため、
> 》予期しない結果が発生する可能性があります。
なるほど、

色々と、模索していただきありがとうございます。

不特定な方々を対称にしているので、ENキーボードにするのは難しそうです。

私の能力では、Clipboardを使用する方法が思い浮かびませんでした。
ありがとうございます。
---------------------------解決-----------------------------------
Microsoft.VisualBasic.Interaction.AppActivate("メモ帳");
Clipboard.SetText("^", TextDataFormat.UnicodeText);
SendKeys.SendWait("FirstIndex+{INS}SecondIndex{ENTER}");
Clipboard.Clear();
------------------------------------------------------------------
解決済み
引用返信 編集キー/
■75441 / inTopicNo.4)  Re[3]: Sendkeysで^(カレット記号)を送る
□投稿者/ 魔界の仮面弁士 (261回)-(2015/03/25(Wed) 10:57:05)
No75434 (Sendkeys さん) に返信
> 不特定な方々を対称にしているので、ENキーボードにするのは難しそうです。

対象者が不特定なのであれば、SeneKeys を使うよりも、
EM_REPLACESEL や EM_SETTEXT で送りつけた方が安定するかも。
解決済み
引用返信 編集キー/
■75448 / inTopicNo.5)  Re[4]: Sendkeysで^(カレット記号)を送る
□投稿者/ Sendkeys (3回)-(2015/03/25(Wed) 22:16:31)
> 対象者が不特定なのであれば、SeneKeys を使うよりも、
> EM_REPLACESEL や EM_SETTEXT で送りつけた方が安定するかも。

勉強になりました。

ありがとうございます。

引用返信 編集キー/
■75449 / inTopicNo.6)  Re[5]: Sendkeysで^(カレット記号)を送る
□投稿者/ 魔界の仮面弁士 (263回)-(2015/03/26(Thu) 10:17:31)
No75448 (Sendkeys さん) に返信
>>対象者が不特定なのであれば、SeneKeys を使うよりも、
>>EM_REPLACESEL や EM_SETTEXT で送りつけた方が安定するかも。
> 勉強になりました。

EM_SETTEXT → WM_SETTEXT の間違いです。m(_ _)m

以下サンプル:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
 public partial class Form1 : Form
 {
  public Form1()
  {
   InitializeComponent();
   this.textBox1.Text = "FirstIndex^SecondIndex\r\n";
  }

  [DllImport("user32", CharSet = CharSet.Unicode)]
  static extern IntPtr FindWindowEx(IntPtr hWnd, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

  private void button1_Click(object sender, EventArgs e)
  {
   var message = this.textBox1.Text;
   foreach (var p in Process.GetProcessesByName("notepad"))
   {
    var h = FindWindowEx(p.MainWindowHandle, IntPtr.Zero, "Edit", null);
    if (h != IntPtr.Zero)
    {
     Sample.SetText(h, message);
     //Sample.AppendText(h, message);
    }
   }
  }

  public static class Sample
  {
   [DllImport("user32", CharSet = CharSet.Unicode)]
   static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);
   [DllImport("user32", CharSet = CharSet.Unicode)]
   static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

   public static void SetText(IntPtr hwnd, string text)
   {
    const int WM_SETEXT = 0xC;
    if (text == null) text = "";
    SendMessage(hwnd, WM_SETEXT, IntPtr.Zero, text);
   }

   public static void AppendText(IntPtr hwnd, string text)
   {
    const int WM_GETTEXTLENGTH = 0xE;
    const int EM_SETSEL = 0xB1;
    const int EM_REPLACESEL = 0xC2;
    if (text == null) text = "";
    IntPtr textLength = SendMessage(hwnd, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero);
    SendMessage(hwnd, EM_SETSEL, textLength, textLength);
    SendMessage(hwnd, EM_REPLACESEL, IntPtr.Zero, text);
   }
  }
 }
}
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -