トップ | puarts.com
メモ  |  制作記  |  開発記  |  日常の記録  |  デジタルコンテンツ制作  |  ファイアーエムブレム  |  ゲーム  |  C/C++  |  C#  |  PC/ソフトウェア  |  Web 開発  |  スクリプト言語  |  その他プログラミング  |  
「CSharp」に関連する記事一覧

0  

名前付きパイプのプロセス間通信をサーバー側 C#、クライアント側 C++ で書く

2016/09/27

C++ 名前付きパイプによるプロセス間通信の小さいサンプルの記事で載せた C++ のIPCサンプルで、サーバー側を C# にしたくなったので、C# に置き換えました。挙動は全く同じです。

ソースコードを載せておきます。

サーバー側の C# コード


using System.IO;
using System.IO.Pipes;

namespace PicSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var server = new NamedPipeServerStream("mynamedpipe");
            System.Console.WriteLine("クライアント起動待ち..");
            server.WaitForConnection();
            StreamWriter streamWriter = new StreamWriter(server);
            string sendMessage = string.Empty;
            do
            {
                System.Console.Write("送信する文字を入力(Endで終了): ");
                sendMessage = System.Console.ReadLine();
                streamWriter.Write(sendMessage);
                streamWriter.Flush();
                server.WaitForPipeDrain();
            } while (sendMessage != "End");

            server.Dispose();
        }
    }
}

クライアント側の C++ コード


#include <Windows.h>
#include <iostream>

void main()
{
    HANDLE pipeHandle = CreateFile(L"\\\\.\\pipe\\mynamedpipe", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (pipeHandle == INVALID_HANDLE_VALUE)
    {
        std::cout << "パイプ作成に失敗" << std::endl;
        return;
    }

    std::cout << "サーバーから受信開始" << std::endl;

    // 文字列受信
    char recvBuffer[256];    //受信バッファ
    do
    {
        recvBuffer[0] = '\0';
        DWORD recvBuffer;
        ReadFile(pipeHandle, recvBuffer, sizeof(recvBuffer), &recvBuffer, NULL);
        if (recvBuffer[0] == '\0')
        {
            continue;
        }
        recvBuffer[readBytes] = '\0';
        std::cout << "受信: " << recvBuffer << std::endl;
    } while (strcmp(recvBuffer, "End") != 0);

    CloseHandle(pipeHandle);
}

WPF 透明なウィンドウを作る

2014/06/21
(2018/10/27 更新)

WPFで透明のウィンドウを作るサンプルです。AllowTransparency="True"にして、WindowStyle="None"にして、Backgroundに低いOpacityのブラシを設定してやると透明になります。


<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Height="350"
        Width="525"
        AllowsTransparency="True"
        WindowStyle="None">
    <Window.Background>
        <SolidColorBrush Opacity="0.5" Color="White"/>
    </Window.Background>
</Window>

WPF キーなしのグローバルスタイルをオーバーライドする方法

2014/06/16 23:00
(2018/10/27 更新)

WPFでキーのないグローバルなスタイルを上書きする方法をメモしておきます。BasedOn="{StaticResource {x:Type Button}}"でキーのないスタイルをオーバーライド出来るようです。


<Style TargetType="Button" x:Key="StandardButton" BasedOn="{StaticResource {x:Type Button}}">
    <Setter Property="Margin" Value="2 0 2 0"></Setter>
    <Setter Property="MinWidth" Value="80"></Setter>
    <Setter Property="Height" Value="30"></Setter>
</Style>

参考URL
http://stackoverflow.com/questions/1303634/how-to-override-a-global-style-that-doesnt-have-an-xkey-or-alternatively-ap

WPF AvalonDock ドキュメントプロパティのバインド

2014/06/16 16:00
(2018/10/27 更新)

AvalonDockのDockingManagerでドキュメントのTitleをビューモデルにバインドする際に、Model.をつけてビューモデルのプロパティにアクセスしなければならないということに最初気が付かなくて少しはまったのでメモしておきます。


<avalonDock:DockingManager 
    DocumentsSource="{Binding DocumentViewModels}"
    x:Name="commandDockingManager">
    <avalonDock:DockingManager.LayoutItemContainerStyle>
        <Style TargetType="{x:Type avalonDock:LayoutItem}">
            <Setter Property="Title" Value="{Binding Model.Title}" />
        </Style>
    </avalonDock:DockingManager.LayoutItemContainerStyle>
    
    <avalonDock:DockingManager.LayoutItemTemplate>
        <DataTemplate>
            <TextBox />
        </DataTemplate>
    </avalonDock:DockingManager.LayoutItemTemplate>

    <avalonDock:LayoutRoot>
        <avalonDock:LayoutPanel Orientation="Vertical">
            <avalonDock:LayoutDocumentPane/>
        </avalonDock:LayoutPanel>
    </avalonDock:LayoutRoot>
</avalonDock:DockingManager>

C# VisualStudioでのアプリケーション設定保存、読み込み手順

2014/06/16 08:00

Visual StudioのプロジェクトデザイナーからのC#アプリケーション設定の保存、読み込み手順をメモしておきます。

  1. プロジェクトのプロパティを開く
  2. 設定を開いて保存したプロパティを入力
  3. 保存したいところに下記のようなコードを書いて保存
  4. 
    Properties.Settings.Default["RelativeX"] = RelativeX;
    Properties.Settings.Default["RelativeY"] = RelativeY;
    Properties.Settings.Default.Save();
    
  5. 読み込みたいところで(アプリケーション初期化時などに)下記のようなコードを書いて読み込み
  6. 
    RelativeX = (int)Properties.Settings.Default["RelativeX"];
    RelativeY = (int)Properties.Settings.Default["RelativeY"];
    

参考URL
http://msdn.microsoft.com/ja-jp/library/c9db58th(v=vs.100).aspx

C# ローレベルのキーボード入力をフックする

2014/06/09

C# でキーボード入力をアプリにフォーカスしていない時でもフック出来る方法を探していたら良いサンプルを見つけたのでリンクを貼っておきます。

http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx

C# デスクトップに直接グラフィックス描画

2014/06/03

デスクトップ上に直接サークルを描画するサンプルです。


using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;

class Program {
    [DllImport("User32.dll")]
    static extern IntPtr GetDC(IntPtr hwnd);

    [DllImport("User32.dll")]
    static extern void ReleaseDC(IntPtr hwnd, IntPtr dc);

    static void Main(string[] args) {
        IntPtr desktopDC = GetDC(IntPtr.Zero);
        using (Graphics g = Graphics.FromHdc(desktopDC)) {
            g.FillEllipse(System.Drawing.Brushes.Red, 100, 100, 30, 30);
        }

        ReleaseDC((IntPtr.Zero, desktopDC);
    }
}

C# WPF 任意の座標にマウスポインタを移動してクリックイベントを発生させる

2014/05/18

C#で任意の座標にマウスポインタを移動し、クリックイベントを実行するWPFサンプルです。


MainWindow.xaml

<Window x:Class="MouseCommander.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="90" Width="250">
    <Window.Resources>
        <ResourceDictionary>
            <Style TargetType="Button">
                <Setter Property="Margin" Value="10 0 0 0"></Setter>
                <Setter Property="Width" Value="100"></Setter>
                <Setter Property="Height" Value="30"></Setter>
            </Style>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <StackPanel Orientation="Horizontal" 
                    Margin="10"
                    Height="30" HorizontalAlignment="Right" VerticalAlignment="Bottom">
            <Button Name="startButton" Click="StartButton_Click" >開始</Button>
            <Button Name="stopButton" Click="StopButton_Click">終了</Button>
        </StackPanel>
    </Grid>
</Window>

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace MouseCommander
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        [DllImport("USER32.dll", CallingConvention = CallingConvention.StdCall)]
        private static extern void SetCursorPos(int X, int Y);

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

        private const int MOUSEEVENTF_LEFTDOWN = 0x2;
        private const int MOUSEEVENTF_LEFTUP = 0x4;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void StartButton_Click(object sender, RoutedEventArgs e)
        {
            var stopButtonPosition = stopButton.PointToScreen(new Point(0, 0));
            SetCursorPos((int)stopButtonPosition.X + 1, (int)stopButtonPosition.Y + 1);
            mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
            mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);      
        }

        private void StopButton_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("終了");
        }
    }
}

C# WPF TextBoxで改行

2014/05/18

WPF TextBoxでテキストの改行は&#xa;コードで出来るようです。すぐにわからなかったのでメモしておきます。


<TextBox Text="Hello,&#xa;world!" 
         AcceptsReturn="True" />

C# 構造体のメモリ配置を指定する

2011/02/12

C++のリソースをDLLを経由すればC#でも使えるということなのでGUI作成で強力な力を発揮してくれるC#を始めることにしました。

データを共有するためにC++とC#で共有する構造体を作る必要がありましたが、.NET Frameworkでは性能向上のために構造体の各メンバを適当に配置してしまうようです。アライメントの知識のないプログラマが構造体を作っても、無駄なメモリを消費しないようにできているということですね。

これではCとC#で共有する構造体を使うときに困ってしまいますので、以下のように[StructLayout(LayoutKind.Sequential)]を使うことでメモリ配置をC言語のときと同様に指定できるようになるようです。

Example

[StructLayout(LayoutKind.Sequential)]
public struct Point
{
    public int x;
    public int y;

    public Point(int in_x, int in_y)
    {
        x = in_x;
        y = in_y;
    }
}

 

0  

にほんブログ村 ゲームブログ ファイアーエムブレムへ にほんブログ村 デザインブログ コンピュータグラフィックスへ

0.0218 sec

Copyright(C)2006-2018 wsp All Rights Reserved