2012年11月19日月曜日

ClickOnesでパラメータを渡すとエラーになる


ClickOnesでパラメータを渡すとエラーになった。




セキュリティーでガードがかかっているので、上記CheckBOXをチェック




2012年11月15日木曜日

動作中のプロセスにキー入力をするフォームアプリケーション

動作中のプロセスにキー入力をするフォームアプリケーションAdd Star

f:id:yatt:20110402165403p:image
.NETで他のプロセスにキー入力をする必要があったので、その方法について.NETを前提で調べました。結果、MSDN@ITとかそこらを調べるだけでなんとかなりました。

プロセス一覧の取得

System.Diagnostics.Process.GetProcesses()でProcessインスタンス配列が手に入ります。 Process.IdだとかProcess.MainWindowHandleなどをつかってプロセスの情報にアクセスし操作します。

キーストロークの入力

System.Windows.Forms.SendKeys.Send(string)で、アクティブなプロセスにキー入力をできます。
プロセスをアクティブにするためWIN32APIのSetForegroundWindowを使いました。
参考:MSDN http://msdn.microsoft.com/ja-jp/library/system.windows.forms.sendkeys(v=vs.80).aspx

流れ

プログラムの流れは、
  1. 「更新」ボタンでコンボボックスのプロセス一覧を更新
  2. コンボボックスでプロセスを選択
  3. テキストボックスにキー入力
  4. 「送信」ボタンでキー入力を指定されたプロセスに送信
という感じの流れでプログラムを作りました。上の画像では、chromeに「Ctrl+t Ctrl+k エ イ プ リ ル フ ー ル (エンターキー)」を入力して、「エイプリルフール」という文字列google検索させようとしています。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices; // setforegraoundwindow

namespace SendKeyType
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        // http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html
        [DllImport("user32.dll")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);
        private void button2_Click(object sender, EventArgs e)
        {
            // 選択しているプロセスをアクティブ
            int pid = int.Parse(comboBox1.SelectedValue.ToString());
            Process p = Process.GetProcessById(pid);
            SetForegroundWindow(p.MainWindowHandle);
            // キーストロークを送信
            SendKeys.Send(textBox1.Text);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            // プロセス一覧を更新
            comboBox1.DataSource = ProcessTable();
            comboBox1.ValueMember = "PID";
            comboBox1.DisplayMember = "NAME";
        }
        private DataTable ProcessTable()
        {
            // プロセスのリストを取得
            // http://d.hatena.ne.jp/tomoemon/20080430/p2
            Process[] ps = Process.GetProcesses();
            Array.Sort(ps, new ProcComparator());

            DataTable table = new DataTable();
            table.Columns.Add("PID");
            table.Columns.Add("NAME");

            foreach (Process p in ps)
            {
                DataRow row = table.NewRow();
                row.SetField<int>("PID", p.Id);
                row.SetField<string>("NAME", p.ProcessName + " - " + p.MainWindowTitle);

                table.Rows.Add(row);
            }
            table.AcceptChanges();

            return table;
        }
        // .....
    }
    
    // プロセス名でソート ... for Array.Sort
    public class ProcComparator : IComparer<Process>
    {
        public int Compare(Process p, Process q)
        {
            return p.ProcessName.CompareTo(q.ProcessName);
        }
    } 
 
元ネタ
http://d.hatena.ne.jp/yatt/20110402/1301731512 

COM to Keyborad

COMポートからキーボードへ変換するソフト


http://park19.wakwak.com/~gadget_factory/factory/comkey/index.html

QRCodeを読んで受注入力の保管をお願いされたが
入力画面でPFKeyの入力が必要になった。

QRCodeでは、文字、数字はOKだが、PFKeyはNGだった。

1万から2万くらいで変換ソフトはあるが、フリーが無かったので探していたら
上記のソフトを見つけました。

QRCode Library

.NET QRCode Library

Code Project
http://www.codeproject.com/Articles/20574/Open-Source-QRCode-Library

QRコードで入力受注入力を補完することが出来るかも。

2012年11月14日水曜日

GMap.NET , OSS

Open Source Software.

C#で書かれた地図
http://greatmaps.codeplex.com/

ライセンスはMIT

2012年11月9日金曜日

asp.net listitem内の改行

asp.net listitem内の改行


&lt;br&gt;と書けば改行してくれる模様
<asp:RadioButtonList id="RadioButtonList1" runat="server" 
Width="336px" Font-Size="16pt" Height="161px">
<asp:ListItem Value="1">鍋料理&lt;br&gt;(牡丹鍋・チゲ鍋・闇鍋 ほか)</asp:ListItem>
</asp:RadioButtonList>

2012年11月7日水曜日

JBolt 起動時にアプリを有効にする方法

JBolt 起動時にアプリを有効にする方法

JBoltサービスを起動してもアプリは無効になっている場合

1.OSサービスで、iBoltサービスを起動にする。
2.iBoltアプリをre-buildする
3.mgrb.iniに、アプリ起動のecfを指定する

MAGIC Brokerに、起動したいアプリの記述があれば
起動時にアプリを起動させる。

2012年11月5日月曜日

【Visual Studio C#】[Windows サービスでバッチファイル起動]


Windows サービスの作成手順
1.「Windows サービス」プロジェクトの作成
2.「Windows サービス」プロジェクトへの「インストーラの追加」
3.「Windows サービス」のインストール/デバック

1.「Windows サービス」プロジェクトの作成
 (1)「Microsoft Visual Studio 2008」を起動
 (2)「ファイル」-「新規作成」-「プロジェクト」を実行
 (3)「Visual c#」-「Windows」-「Windows サービス」を選択して「OK」をクリック
 (4)「ツールボックス」の下の方の空いている場所でマウス右クリックして「アイテムの選択」を実行
 (5)「.Net Framework コンポーネント」の名前=「Timer」、名前空間=「System.Timers.Timer」をチェックして「OK」をクリック
    ↑のコンポーネントでないとTimerの「Elapsed」イベントが発生しない....
 (6)「System.Timers.Timer」を「Service1.cs」へドラッグ&ドロップ
 (7)「Timer1」のプロパティを確認
    「Enabled」を「False」に設定
    「Interval」を適当に設定(設定はミリ秒)
 (8)「Timer1」をダブルクリック....「Service1.cs」のコードを以下のように編集
    public partial class Service1 : ServiceBase
    {
      // バッチファイルパス
      private const string sBatPath = "c:\hoge.bat";
      // 実行間隔(....new TimeSpan(時, 分, 秒))
      private readonly TimeSpan tsExecuteInterval = new TimeSpan(24, 0, 0);

      // 実行日時....初期値:本日(yyyy/MM/dd)+時間(hh:mm:ss)....バッチ実行完了時に実行間隔を加算して次回実行日時とする
      private DateTime dtExecuteDateTime =
        DateTime.Parse(DateTime.Now.ToShortDateString() + " 23:30:00");

      protected override void OnStart(string[] args)
      {
        // デバック(「ツール」-「プロセスにアタッチ」)開始操作する間スリープさせる....これがあるとOnStartのでバックが可能....
        System.Threading.Thread.Sleep(20000);
        // タイマ開始
        timer1.Enabled = true;
      }
      protected override void OnStop()
      {
        // タイマ停止
        timer1.Enabled = false;
      }
      private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
      {
        if (DateTime.Now > dtExecuteDateTime)
        {
          // ProcessStartInfoを使用
          System.Diagnostics.ProcessStartInfo processStartInfo =
            new System.Diagnostics.ProcessStartInfo();
          // ComSpecのパスを取得
          processStartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec");
          // 出力を読取可能
          processStartInfo.RedirectStandardInput = false;
          processStartInfo.RedirectStandardOutput = true;
          processStartInfo.UseShellExecute = false;
          // ウィンドウを表示しない
          processStartInfo.CreateNoWindow = true;
          // コマンドラインを指定("/c"は実行後閉じるために必要)
          processStartInfo.Arguments = @"/c " + sBatPath;

          // バッチファイル起動
          System.Diagnostics.Process process = System.Diagnostics.Process.Start(processStartInfo);
          // 出力を読み取る
          string sResults = process.StandardOutput.ReadToEnd();
          // WaitForExitはReadToEndの後である必要がある(親プロセス、子プロセスでブロック防止のため)
          process.WaitForExit();

          // 出力結果を表示
          Console.WriteLine(sResults);

          // 実行日時に実行間隔を加算して次回実行日時とする
          dtExecuteDateTime = DateTime.Parse(dtExecuteDateTime.Add(tsExecuteInterval).ToString());
        }
      }
    }

2.「Windows サービス」プロジェクトへの「インストーラの追加」
 (1)「Service1.cs」の「デザイン」画面をマウス右クリックして「インストーラの追加」を実行
 (2)「ServiceInstaller1」のプロパティを確認
    「Description」:サービス一覧画面に表示する説明
    「DisplayName」:サービス一覧画面に表示する名前
    「ServiceName」:サービスの識別名....とりあえずサービスのクラス名と合わせる方がよさげ
    「StartType」 :インストール直後の「スタートアップの種類」....とりあえず「Manual」に設定
 (3)「ServiceProcessInstaller1」のプロパティを確認
    「Account」 :サービスの実行アカウント....「LocalSystem」に設定

3.「Windows サービス」のインストール/デバック
 (1)(Windows)\Microsoft.NET\Framework\(バージョン)\installutil.exeを使用してインストール
    >installutil.exe (サービスプログラム名).exe
  アンインストール
    >installutil.exe /u (サービスプログラム名).exe
 (2)「コントロールパネル」-「管理ツール」-「サービス」を実行して(サービスプログラム)を開始する
 (3)「ツール」-「プロセスにアタッチ」を実行
    「すべてのユーザからのプロセスを表示する」をチェックする
    「すべてのセッションのプロセスを表示する」をチェックする
    「(サービスプログラム名).exe」を選択して「アタッチ」をクリックする

元ネタ:
http://ameblo.jp/dakishimetai-com/entry-10494391310.html

2012年11月2日金曜日

FireFox Windows認証を有効にする

Windows環境において統合Windows認証を利用したイントラネットサイトを開く場合
IEでは自動で認証が通るが、Firefoxではダイヤログボックスが出てきて
ユーザー名、パスワードを入力する必要がある。
Firefoxでもこの統合Windows認証には対応しており、次の設定により自動化を有効に出来る。

1.ロケーションバーに”about:config"と入力し、Enterキーを押す。
2.'network.automatic-ntlm-auth.trusted-uris'
    'network.negotiate-auth.delegation-uris'
    'network.negotiate-auth.trusted-uris' を探し

それぞれダブルクリックして、統合Windows認証を行っているサイトのURL(例:http://aaaa.local.com)を入力す る。

以上でIEと同様に自動で統合認証が行われる。

2012年11月1日木曜日

ファイル改行

ファイル改行
今までは @"\r\n"としていた。
それを、以下のように修正出来る。

改行コード .NewLine 
// 読み込んだものを追加で格納する
stResult += stBuffer + System.Environment.NewLine;