發表文章

用C#建立電腦保護螢幕程式

自己嘗試著做一下電腦保護螢幕的程式。相信大家google找一下這個主題,應該也可以找到一些資料。 建好的exe檔請把exe附檔名改為scr檔。拷貝到目錄C:\Windows\System32下。 我們在設定保護螢幕時,有選取,設定,預覽等項目。試了一下,大約如下: 選取該項目:兩個參數。第一個: "/p", 第二個應該是handle之類的。程式中可以不處理。 設置按鈕:一個參數。字串為"/c:"+handle數字。設置完後,會再一次a.項中的選取該項目的參數,也就是該保護螢幕程式會執行兩次。 預覽按鈕:一個參數。字串為"/s"。 真實執行螢幕保護程式:與預覽按鈕相同。 在你的螢幕保護程式對應2.中的參數。實作在Program.cs內。大約如下: static void Main(string[] args) { if (args != null) { if (args.Length < 1) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new mainForm()); } else if (args[0].Substring(0, 2).Equals("/c")) { Application.Run(new SetItUp()); //設定卷軸速度表格 } else if (args[0].Substring(0, 2).Equals("/s")) { Application.Enab...

Windows登錄檔C#程式編輯

Windows有提供Registry登錄檔以供系統或是程式使用。可以參考維基百科 登錄檔 。 使用類別: RegistryKey 命名空間: Microsoft.Win32 我們先看一下設定值的寫法 private void SetRegeditData(string name, string tovalue, RegistryValueKind regKind){ RegistryKey hklm = Registry.CurrentUser; RegistryKey software = hklm.OpenSubKey("Software", true); RegistryKey aimdir = software.CreateSubKey("DearJames"); aimdir.SetValue(name, tovalue, regKind); } 設定值本來存在的就覆蓋,本來沒有的就新建。 但是讀取值就不一樣了! 個人寫的function如下: private string GetRegeditData(string name) { string registData; RegistryKey hkml = Registry.CurrentUser; RegistryKey software = hkml.OpenSubKey("Software", true); RegistryKey aimdir = software.OpenSubKey("DearJames", true); if(aimdir==null) { software.CreateSubKey("DearJames"); aimdir = software.OpenSubKey("DearJames", true); } registData =...

C# picturebox的Image 取得網路攝像頭圖像資料

版权声明:本文为CSDN博主「吕家少爷」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_43240642/java/article/details/101430811 PS. CSDN的作者也是我本人!  有個項目使用了攝影機,其為網路線傳輸資料的。內附的DLL是靠 Function: MVImageDrawHwnd(…) 〈-- 用Handle接受資料 Function: MVImageDraw(…) 〈-- 用hdc接受資料 原本使用了第一個Function, 把picturebox的Handle傳過去,MVImageDrawHwnd(hCameraImage, picturebox1.Handle,…) 結果Picturebox1裡面可以看到了影像。以單張的為例,Picturebox的卷軸一卷就不見了。檢查了picturebox1.Image內,發現是null。可是這圖像不是眼睛看到就好,我是要處理的。網站搜尋了一下,都沒有找到解決方法。拉里拉雜的話不談。直接把我解決的方式如下說了!我是使用了第二的Function實踐之!其實也該感謝搜尋的網站內容,很有啟發性! 在抓到摄影機的解析度时,先設定global Bitmap變數的大小: GrabImageData = new Bitmap(w, h); 在攝影機獲取圖像的函式內使用如下的程序: picGrab.Image = GrabImageData; //指定picGrab之Image為GrabImageData(Bitmap型態) Graphics g = Graphics.FromImage(picGrab.Image); //產生Graphics在picGrab上 IntPtr pptt2 = g.GetHdc(); //取得g之hdc MVAPI.MVImage.MVImageDraw(m_hImage, pptt2, 0, 0); //將取得相機之影像傳到建立在picGrab上之Bitmap,其連接在GrabImageData g.ReleaseHdc(); //Release HDC g.Dispose(); //釋放g 資源 在前項所列的g.R...

強制轉型---陣列篇

一般來說,單一的變數容易做強制轉換型別。但是整個陣列就很難了。 查到可以用Convertall來進行。下方為例: int[] numberInt=new int[3]; double[] numberDouble; numberDouble= Array.ConvertAll(numberInt, new Converter(IntToDouble)); public static double IntToDouble(int s) { double rtn=(double)s; return rtn; }

Array與List

陣列Array是個大家非常常用的變數型態。但是,他的操作並不是太多。如果你想要用在學校學到的資料結構的Add, Remove, Insert, Sort等等的方式。Array並沒有提供。但是,在C#裡面有提供了一個List型態。就可以達成這些功能。 首先,先說一下Array與List之間的互換。 Array連結至List: int[] a = int[5] {5,3,4,1,2}; List list_a=new List (a); List變回到a Array的部分,可以用 a=list_a.ToArray(); 所以,可以先把Array變到List, List操作完再變回Array即可。比如說: int[] a = int[5] {5,3,4,1,2}; List list_a=new List (a); list_a.Add(10); a=list_a.ToArray(); //a變成int[6] {5,3,4,1,2,10} list_a.Remove(1);//移除數字為1的項目 a=list_a.ToArray(); //a變成int[5] {5,3,4,2,10} list_a.Insert(3,8);//在Index 3裡面加入值為8的數字 a=list_a.ToArray(); //a變成int[6] {5,3,4,8,2,10} list_a.Sort(); a=list_a.ToArray(); //a變成int[6] {2,3,4,5,8,10} List也可以對應到多維不規則陣列: int[] p1 = new int[4] { 4, 1, 2, 3 }; int[] p2 = new int[6] { 5, 3, 1, 2, 8, 9 }; List myList = new List (); myList.Add(p1); myList.Add(p2); int[][] p1p2 = myList.ToArray();

Read INI file

以下的程式,是copy別人的source code, 由於copy的時候未將網站記錄下來,已經有些久遠了,在此特別註記!! 利用.ini檔可以動態的在程式中設定一些東西。可以很彈性的使用。無須客戶或是外在的一點點小改變就必須重新更新程式。以下是我的source file, 有興趣的可以參考。程式語言是用C#。 using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; public class ReadINI { [DllImport("kernel32")] private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); [DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); private bool bDisposed = false; private string _FilePath = string.Empty; public string FilePath { get { if (_FilePath == null) return string.Empty; else return _FilePath; } set { if...

多維陣列的Resize

圖片
在不規則的多維陣列中,每個陣列其實是各自獨立。所以Resize也是會各自的分開各自處理。比如說下面的一個例子: int[][] myJaggedArray = { new int[] { 2, 3, 4 }, new int[] { 13, 23 } }; 如果說myJaggedArray[0]的Length由3要改為4, myJaggedArray[1]的Length由2改為1。 Array.Resize(ref myJaggedArray[0], 4); Array.Resize(ref myJaggedArray[1], 1); 結果會變成 myJaggedArray[0]變成{ 2, 3, 4, 0 } myJaggedArray[1]變成{ 13 } 但是規則的多維陣列中,整個陣列可以說是一體的。 因為這種的陣列,並無法用Array.Resize這個方法來進行。所以很多網路上的作法是利用Array.Copy進行。比如像下方的程式段: int[,] myArray = new int[2, 3] { { 2, 3, 4 }, { 13, 23, 33 } }; myResize1(ref myArray, 3, 4); private void myResize1(ref int[,] changeArray, int rank0, int rank1) { int s_rank0 = changeArray.GetLength(0); int s_rank1 = changeArray.GetLength(1); int[,] array2 = new int[rank0, rank1]; Array.Copy(changeArray, array2, s_rank0 * s_rank1); changeArray = array2; } 最後的結果會變成 myArray[3, 4]= { { 2, 3, 4, 13 }, { 23, 33, ...

如何動態新增RadioButton控制項在GroupBox的Container內

前一篇文章有提到要進行聰明牌型提示。一副十三支的牌,有時候可以選擇的牌型很多樣,有時候卻很少。 因此,我想在Container內用RadioButton的方式來提出可以讓使用者選擇成是已經判斷出來可以用的牌型。也就是想在GroupBox內動態產生RadioButton控制項方式進行。 我參考了以下的網站: http://61.219.235.182:101/taiwan/msdn/library/2002/Apr-2002/whitepaper/vbtchCreatingControlArraysInVisualBasicNETVisualCNET.htm 這網站裡面寫的是在Forms內產生動態的Button。我略改了一下來用做我產生RadioButton控制項以及處理的類別。RadioButtonArray類別的程式如下: class RadioButtonArray : System.Collections.CollectionBase { private GroupBox thisGroupBox = new GroupBox(); int startX = 0, startY = 0; public RadioButtonArray(GroupBox myGroupBox) { thisGroupBox = myGroupBox; this.AddNewRadioButton(); } public RadioButtonArray(GroupBox myGroupBox, string radioBtnString) { thisGroupBox = myGroupBox; this.AddNewRadioButton(radioBtnString); } public RadioButtonArray(GroupBox myGroupBox, int positionX, int positionY) { thisGroupBox = myGroupBox; ...

撲克牌系統

目前正在寫個撲克牌的程式,先是以十三支為應用的程式。希望裡面所寫出的class屆時可以運用到其他各種的撲克牌應用。 基本上,裡面的class我還是採取了以資料結構的方式來進行。主要的動作有: 1. 洗牌: 目前是採用多次數的兩兩交換方式進行。 2. 抽牌: 是將某一張牌從某個牌組拉出到另一個牌組,比如說打十三支時從你的牌中拉出為你的第一墩3張牌的部分,或是第二第三墩5張牌的部分。又如以後程式要寫成玩撿紅點,你牌打出去的動作,都可以為抽牌的動作。 3. 發牌: 等於是依序由主牌組抽牌(也就是都抽第一張牌)到各玩家手上的動作。 4. 判斷牌形,比較大小: 也就是判斷出你拉出的牌組是屬於哪一種,共分為: 同花順,鐵支,葫蘆,同花,順,三條,兩對,一對,烏龍等牌形。記錄大小部分,只記錄足夠資訊即可。比如說,順子方面只要記錄最大的那張牌即可。葫蘆或三條的部分,都記錄三條的部分的牌就可以。像同花,烏龍,則五張牌大小都得記錄。對子就必記錄對子的部分跟非對子的牌大小都得記錄。 5. 切牌: 對於十三支一般而言,民間玩法都是在發牌者洗完牌之後允許其他玩家切牌,一般而言,是以發牌者為守來看尾家切牌。而像撿紅點就必須尾家切牌而且可以看他自己切的牌是哪一支牌,其他玩家不可以看。 6. 聰明選牌: 根據以前我的經驗,把手上的牌列出可能可以打的牌種與大小,供玩家選用。這項可能比較有挑戰性。程式如何實現,必須要好好構思。當然可以的話,甚至可以讓程式學習以往獲勝的機率,讓獲勝機率高的牌形組合在前面些讓玩家選擇。當然程式絕不能有偷看別家目前的牌來給玩家選擇的可能性。不然會完全失去遊戲公平性。 7. 遊戲界面與美工: 這個提供了剛開始玩家在熟悉遊戲時,跟爾後繼續玩的興趣很大的重要性。畢竟不夠友善的遊戲都是很快被淘汰的。 8. 網路化: 目前我的程式都是在單機上進行撰寫,玩家當然是自己跟自己,在聰明選牌還沒做出時,玩家還無法跟電腦玩。當然,如果聰明選牌法還未做出時,有網路的話就可以進行遊戲了。反正電腦只要負責最後仲裁誰贏誰輸即可。網路化其實會牽涉到很多網路上的課題,一個是公平與安全性。另一個是記錄以往戰績,必要的話還必須把資料庫方式也用上。 以上是目前我程式撰寫牧錢想的到的規劃。這算是大綱雛形。細節跟以後遇到問題時必須修正時會繼續修正或增補之。

C# 不規則陣列不定長度設定方法

嘗試使用不規則陣列,但是其長度未定。 根據文件不規則陣列,可以寫如下: int[][] jaggedArray2 = new int[][] { new int[] {1,3,5,7,9}, new int[] {0,2,4,6}, new int[] {11,22} }; 但是,今天如果jaggedArray2[0],[1],[2]的陣列實際上長度未定,初始為null。 可以寫成, int[][] jaggedArray2 = new int[][] { new int[] {}, new int[] {}, new int[] {} }; 如果要變更長度, 則可以使用Array.Resize的方式進行,比如: Array.Resize(ref jaggedArray2[0], 2);