#author("2023-11-26T14:58:18+09:00","default:irrp","irrp") #author("2024-03-31T19:22:56+09:00","default:irrp","irrp") →[[OS関連]] →COM技術関連 →Windows dll関連 #contents *Tips [#mf9390b5] -[[C# Win32API完全入門 #C# - Qiita>https://qiita.com/nekotadon/items/f376d17de85dfb84fbd5]] 2024.3 -[[一週間で身につくWIN32プログラミングの基本|ウィンドウズAPIを利用したアプリケーションの作成の基本。>https://c-lang.sevendays-study.com/win32/index_win32.html]] 2023.11 -[[[Delphi] 管理者権限のチェック&管理者としてアプリを実行する - Qiita>https://qiita.com/pik/items/1318a5a88ee2af5270b8]] 2023.10 -[[25行で書けてちょっと便利なマウスジェスチャーソフト|SHIFT Group 技術ブログ|note>https://note.com/shift_tech/n/n440796b2e58c]] 2023.1 -[[別プロセスのメモリを読みたかった話 - Qiita>https://qiita.com/Mikage32/items/91fda6df9bc20eb6ef6c]] 2022.10 -[[Windows 10で始めるC言語開発(28) WindowsでC言語開発! マウスカーソルの動作の違いを確認する (1) | TECH+>https://news.mynavi.jp/techplus/article/c-for-windows-28/]] 2022.4 -[[C++ Win32 APIを始める時に役立つ資料 - Qiita>https://qiita.com/kxkx5150/items/4d3e82c5ec2636b9f819]] 2022.3 -[[MAX_PATH とか _MAX_PATH とか FILENAME_MAX とか - satosystemsの日記>https://satosystems.hatenablog.com/entry/20100807/1281152224]] 2022.1 --[[Maximum Path Length Limitation - Win32 apps | Microsoft Docs>https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd]] 2022.1 --以下のレジストリを設定すると260文字以上のパスも扱えるらしい New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" ` -Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force -[[Windows API AとWどちらがお得? - Qiita>https://qiita.com/kawasaki3/items/6f7b64617680b138fcc4]] 2021.12 --Aを呼んでも結局Wが呼ばれるのでWの方がよい -[[Windows SDK とエミュレーターのアーカイブ>https://developer.microsoft.com/ja-jp/windows/downloads/sdk-archive/]] -[[Metroスタイル・アプリの開発者が知るべき3つのこと>http://www.atmarkit.co.jp/fdotnet/chushin/readyforwin8app_01/readyforwin8app_01_01.html]] 2012.3.13 -[[Windowsパス名の落とし穴>http://www.ipa.go.jp/security/awareness/vendor/programming/b08_01.html]] -[[他のアプリのウィンドウハンドルを得る>http://www.wwlnk.com/boheme/delphi/tips/tec0440.htm]] --FindWindowにクラス名を渡す -[[Win32雑学ノート>http://hp.vector.co.jp/authors/VA000092/win32/win32trivia.html]] --セッション−ウィンドウステーション−デスクトップの関連について説明がある ---これらのデスクトップのさらに上位に位置するのがウィンドウステーションである。ウィンドウステーションには、大きく分けて I/O ウィンドウステーションと Non I/O ウィンドウステーションの2種類がある。後述するセッションには高々ひとつだけ I/O ウィンドウステーションが存在できる。 I/O ウィンドウステーションとは、文字通り Input / Output を行うウィンドウステーション。つまり、セッションにはひとつだけ、入力を受付画面に出力することのできるウィンドウステーションがある。先に述べた二つのデスクトップも、この I/O ウィンドウステーションに属する。 ---では Non I/O ウィンドウステーションは何のために用意されているのだろう。その答えは「サービス」である。サービスは入出力の必要はない。 Non I/O ウィンドウステーションはセッションにいくつでも存在できる。サービスが動作する LUID に応じて Non I/O ウィンドウステーションが作られ、それぞれ GUI 的に隔離された空間に置かれる。 -[[UI Automation overview>http://www.codeproject.com/WPF/UIAutomation1.asp]] -[[Windows API index - Win32 apps | Microsoft Docs>https://docs.microsoft.com/en-us/windows/win32/apiindex/windows-api-list]] *イベントログ [#r88066d9] -出力サンプル char buf[] = "イベントログに記録したいメッセージ"; LPCSTR lpBuf = buf; hEvent = RegisterEventSource( NULL, "hogehoge" ); if (hEvent != NULL) { //イベントログ書き込み bRet = ReportEvent( hEvent, EVENTLOG_ERROR_TYPE, 0, 1, NULL, 1, 0, &lpBuf, NULL); if ( bRet == FALSE ) { DWORD err = GetLastError(); LPVOID lpMsgBuf=NULL; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 既定の言語 (LPTSTR) &lpMsgBuf,0,NULL ); OutputDebugString((LPCSTR)lpMsgBuf); LocalFree(lpMsgBuf); } } -参考サイト:[[イベントログにメッセージを出力する>http://www.syuhitu.org/other/eventlog/eventlog.html]] *Professional User Interface Suite [#y634b152] -http://www.codeproject.com/docking/prod_profuis.asp *DirectX/WPF [#g404c2f6] -[[WPF/MDX:http://www.atmarkit.co.jp/fdotnet/directxworld/directxworld03/directxworld03_02.html]] --MDX=Managed DirectX -[[XNA解説:http://www.atmarkit.co.jp/fdotnet/directxworld/directxworld03/directxworld03_01.html]] -[[WPF概要:http://www.dodgson.org/omo/t/?date=20060922#p10]] 2006.9.25 -[[DirectXの真実:http://www.atmarkit.co.jp/fdotnet/directxworld/directxworld01/directxworld01_01.html]] *GDI/GDI+ [#paeaec10] -[[Fuzzy DropShadows in GDI++:http://www.codeproject.com/useritems/FuzzyDropShadows.asp]] **gdi++.dll [#c66469e0] -http://drwatson.nobody.jp/gdi++/ -フォントの描画をフックして滑らかな表示にする -[[関連スラド記事:http://slashdot.jp/developers/article.pl?sid=06/09/22/1617251]] *小文字→大文字変換 [#i65d5b07] -[[CharUpperBuffW 関数 (winuser.h) - Win32 apps | Microsoft Learn>https://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-charupperbuffw]] --いわゆるToUpper()に相当する CharUpperBuff *システムエラーの際メッセージボックスを出さなくする [#h47814fd] -[[SetErrorMode 関数 (errhandlingapi.h) - Win32 apps | Microsoft Learn>https://learn.microsoft.com/ja-jp/windows/win32/api/errhandlingapi/nf-errhandlingapi-seterrormode]] SetErrorMode( SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); *画面のキャプチャ方法三種類 [#q692acd7] -http://www.codeproject.com/dialog/screencap.asp -GDI経由、DirectX経由、Windows Media API経由の3種類 *Taskbar Progress Control [#x0743f75] -http://www.codeproject.com/statusbar/taskbarctrl.asp *ウィンドウハンドルからモジュール名を得る [#i0c02cd3] -http://www.codeproject.com/cpp/ModuleNameFromWindwHandle.asp *Processing Global Mouse and Keyboard Hooks in C# [#mb551c58] -http://www.codeproject.com/csharp/globalhook.asp *SetUpDIxxx関数によるデバイス情報の列挙 [#vabf01ea] -http://www.codeproject.com/useritems/SimpleSetup.asp *タスクバーをプログラムから制御する [#jbb9b341] -PostMessageを使う -http://www.codeproject.com/useritems/Taskbar_Manipulation.asp * デスクトップ上のウィンドウをグリッドに沿って合わせるユーティリティ [#m651e46e] -メッセージフックのサンプル。Delphi -http://codezine.jp/a/article.aspx?aid=369 *現在ログオンしているユーザの情報を得る [#m4d8e543] -http://www.codeproject.com/useritems/LoggedOnUSer.asp (Part1) -http://www.codeproject.com/useritems/LoggedOnUsersPart2.asp (Part2) *GetSystemMetricsのパラメータの微妙な違い [#m2a633f9] [DllImport("user32.dll")] public static extern int GetSystemMetrics(int nIndex); const int SM_CXSCREEN = 0; const int SM_CYSCREEN = 1; //デスクトップ画面全体 const int SM_CXFULLSCREEN =16; const int SM_CYFULLSCREEN =17; //フルスクリーンにしたときのクライアント領域(ステータスバー分が入らない) const int SM_CXMAXIMIZED=61; const int SM_CYMAXIMIZED=62; //フルスクリーンにしたときの全体(タスクバー分が入らない) *ウィンドウの強制前だし要件への対応 [#z99d3f9a] -※強制的に前に出てくるウィンドウというのは下品な仕様です。本当にそれが必要か?確認した上で実装すべし -単純にSetForegroundWindow APIとかを使うだけではダメである件について -http://techtips.belution.com/ja/vc/0012/ void SetAbsoluteForegroundWindow(HWND hWnd) { int nTargetID, nForegroundID; DWORD sp_time; // フォアグラウンドウィンドウを作成したスレッドのIDを取得 nForegroundID = GetWindowThreadProcessId(GetForegroundWindow(), NULL); // 目的のウィンドウを作成したスレッドのIDを取得 nTargetID = GetWindowThreadProcessId(hWnd, NULL ); // スレッドのインプット状態を結び付ける AttachThreadInput(nTargetID, nForegroundID, TRUE ); // TRUE で結び付け // 現在の設定を sp_time に保存 SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT,0,&sp_time,0); // ウィンドウの切り替え時間を 0ms にする SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT,0,(LPVOID)0,0); // ウィンドウをフォアグラウンドに持ってくる SetForegroundWindow(hWnd); // 設定を元に戻す SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT,0,sp_time,0); // スレッドのインプット状態を切り離す AttachThreadInput(nTargetID, nForegroundID, FALSE ); // FALSE で切り離し } *WMI/CIM [#p4c2113c] -[[「wmic PRODUCT list」コマンドで取得できるインストール情報について - Microsoft コミュニティ>https://answers.microsoft.com/ja-jp/windows/forum/all/wmic-product/9acca023-2300-4c08-a872-a80987471cbd?auth=1]] 2019 -[[WMI の使用 - PowerShell | Microsoft Docs>https://docs.microsoft.com/ja-jp/powershell/scripting/learn/ps101/07-working-with-wmi?view=powershell-7.2]] 2022.3 --Common Information Model (CIM) コマンドレットは、PowerShell バージョン 3.0 で導入されました。 CIM コマンドレットは、Windows マシンと Windows 以外のマシンの両方で使用できるように設計されています。 WMI コマンドレットは非推奨化されているため、古い WMI ではなく CIM コマンドレットを使用することをお勧めします。 -[[CIMWin32 WMI Providers - Win32 apps | Microsoft Docs>https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/cimwin32-wmi-providers]] 2021 -[[非推奨であるwmicコマンドの代替を探す(Get-WmiObject) - Qiita>https://qiita.com/nijinagome/items/a31298f2d0e55668a8c1]] 2020 -[[Win32 Provider - Win32 apps | Microsoft Docs>https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-provider]] 2022.6 --例えば、ユーザアカウントの一覧を得るならこうやる、など Get-WmiObject -Class Win32_Account -ComputerName "localhost" | select Status,Name,SIDType,SID -[[WMIを利用してWindowsOSの情報を取得する [C#] | JOHOBASE>https://johobase.com/wmi-win32-operating-system-csharp/]] 2021.11