{"id":36385,"date":"2025-12-15T11:31:28","date_gmt":"2025-12-15T08:31:28","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/"},"modified":"2025-12-15T11:31:28","modified_gmt":"2025-12-15T08:31:28","slug":"windows-terminal-conpty-ve-win32-input-mode-nedir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/","title":{"rendered":"Windows Terminal, ConPTY ve win32-input-mode Nedir?"},"content":{"rendered":"<p>Go ConPTY Uygulamalar\u0131nda Windows Terminal Girdilerini Y\u00f6netme<\/p>\n<p>Modern terminal uygulamalar\u0131 geli\u015ftirirken, kullan\u0131c\u0131 girdilerini do\u011fru bir \u015fekilde yakalamak ve i\u015flemek \u00e7o\u011fu zaman b\u00fcy\u00fck bir zorluk haline gelebilir. \u00d6zellikle Windows platformunda, Windows Terminal&#8217;in ortaya \u00e7\u0131k\u0131\u015f\u0131 ve beraberinde getirdi\u011fi <code>win32-input-mode<\/code> adl\u0131 \u00f6zel girdi modu, Go ile ConPTY (Console Pseudo-terminal) uygulamalar\u0131 geli\u015ftirenler i\u00e7in beklenmedik karma\u015f\u0131kl\u0131klar yaratmaktad\u0131r. Peki, bu durumun ard\u0131ndaki nedenler nelerdir ve Go kullanarak bu girdileri nas\u0131l &#8220;evcille\u015ftirebiliriz&#8221;? Bu makale, ConPTY&#8217;nin temel dinamiklerinden <code>win32-input-mode<\/code>&#8216;un derinliklerine, Go ile bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in ad\u0131m ad\u0131m \u00e7\u00f6z\u00fcmlere kadar uzanan kapsaml\u0131 bir rehber sunmaktad\u0131r. Okuyucuyu s\u0131f\u0131rdan konuya dahil ederek, hem teorik bilgiyi hem de pratik uygulama \u00f6rneklerini bir araya getirmeyi hedefliyoruz.<\/p>\n<p>Windows i\u015fletim sistemlerinde terminal deneyimi, uzun y\u0131llar boyunca genellikle cmd.exe veya PowerShell gibi geleneksel konsol pencereleriyle s\u0131n\u0131rl\u0131 kalm\u0131\u015ft\u0131. Ancak, Microsoft&#8217;un Windows Terminal&#8217;i piyasaya s\u00fcrmesiyle bu durum k\u00f6kten de\u011fi\u015fti. Windows Terminal, sekmeli aray\u00fczler, GPU h\u0131zland\u0131rmal\u0131 metin i\u015fleme, Unicode ve emoji deste\u011fi gibi modern \u00f6zelliklerle donat\u0131lm\u0131\u015f, geli\u015ftiriciler ve ileri d\u00fczey kullan\u0131c\u0131lar i\u00e7in tasarlanm\u0131\u015f g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Bu modernle\u015fme, terminal uygulamalar\u0131n\u0131n altyap\u0131s\u0131nda da \u00f6nemli yenilikleri beraberinde getirdi.<\/p>\n<p>Bu yeniliklerden en \u00f6nemlisi \u015f\u00fcphesiz ConPTY veya &#8220;Console Pseudo-terminal&#8221; kavram\u0131d\u0131r. Geleneksel olarak, Windows&#8217;taki konsol uygulamalar\u0131 do\u011frudan konsol API&#8217;lerini kullanarak input ve output i\u015flemlerini ger\u00e7ekle\u015ftirirdi. Bu da \u00fc\u00e7\u00fcnc\u00fc taraf terminal em\u00fclat\u00f6rlerinin veya kabuklar\u0131n\u0131n, bu uygulamalar\u0131n davran\u0131\u015flar\u0131n\u0131 manip\u00fcle etmesini veya \u00e7\u0131kt\u0131lar\u0131n\u0131 d\u00fczg\u00fcn bir \u015fekilde ayr\u0131\u015ft\u0131rmas\u0131n\u0131 zorla\u015ft\u0131r\u0131yordu. ConPTY, bu sorunu \u00e7\u00f6zmek i\u00e7in geli\u015ftirilmi\u015f bir aray\u00fczd\u00fcr. T\u0131pk\u0131 Linux&#8217;taki PTY (pseudo-terminal) gibi, ConPTY de bir alt s\u00fcreci (\u00f6rne\u011fin, bir CLI uygulamas\u0131) izole bir konsol oturumunda \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131r. Ancak, PTY&#8217;den farkl\u0131 olarak, ConPTY, alt s\u00fcrecin Windows konsol API&#8217;lerini kullanmaya devam etmesini sa\u011flar. Yani, alt s\u00fcre\u00e7 kendini ger\u00e7ek bir konsolda \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 zannederken, asl\u0131nda onunla ConPTY arac\u0131l\u0131\u011f\u0131yla ileti\u015fim kuran bir ara program vard\u0131r. Bu ara program, alt s\u00fcrecin girdilerini yakalayabilir ve \u00e7\u0131kt\u0131lar\u0131n\u0131 y\u00f6nlendirebilir.<\/p>\n<p>Peki, <code>win32-input-mode<\/code> bu denkleme nerede giriyor? ConPTY, alt s\u00fcrecin \u00e7\u0131kt\u0131s\u0131n\u0131 VT (Virtual Terminal) sekanslar\u0131na d\u00f6n\u00fc\u015ft\u00fcrerek ana s\u00fcrece (yani bizim Go uygulamam\u0131za veya Windows Terminal&#8217;e) g\u00f6nderir. Bu, \u00e7\u0131kt\u0131lar\u0131n modern terminal em\u00fclat\u00f6rleri taraf\u0131ndan kolayca anla\u015f\u0131lmas\u0131n\u0131 ve i\u015flenmesini sa\u011flar. Ancak, girdi taraf\u0131nda i\u015fler biraz daha karma\u015f\u0131kla\u015f\u0131r. Windows Terminal, varsay\u0131lan olarak, daha zengin etkile\u015fimlere olanak tan\u0131mak i\u00e7in <code>win32-input-mode<\/code>&#8216;u kullanabilir. Bu mod etkinle\u015ftirildi\u011finde, kullan\u0131c\u0131dan gelen klavye tu\u015flar\u0131, fare hareketleri ve t\u0131klamalar\u0131 gibi girdiler, do\u011frudan VT sekanslar\u0131 olarak de\u011fil, Windows&#8217;un kendi <code>INPUT_RECORD<\/code> yap\u0131s\u0131 format\u0131nda ConPTY arac\u0131l\u0131\u011f\u0131yla alt s\u00fcrece g\u00f6nderilir. Bu, \u00f6zellikle fare etkile\u015fimi, \u00f6zel tu\u015f kombinasyonlar\u0131 veya pencere yeniden boyutland\u0131rma gibi olaylar\u0131n detayl\u0131 bir \u015fekilde yakalanmas\u0131 gerekti\u011finde \u00f6nemlidir.<\/p>\n<p>Go programlama dili, sistem programlama yetenekleri ve C\/C++ ile kolayca entegre olabilme \u00f6zelli\u011fi sayesinde, ConPTY API&#8217;leriyle do\u011frudan etkile\u015fime ge\u00e7mek i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r. <code>syscall<\/code> paketi ve ilgili Windows API&#8217;leri arac\u0131l\u0131\u011f\u0131yla Go uygulamalar\u0131, ConPTY oturumlar\u0131 olu\u015fturabilir, alt s\u00fcre\u00e7leri y\u00f6netebilir ve girdi\/\u00e7\u0131kt\u0131 ak\u0131\u015flar\u0131n\u0131 kontrol edebilir. Ancak, <code>win32-input-mode<\/code>&#8216;un varl\u0131\u011f\u0131, bu girdilerin standart VT sekanslar\u0131 yerine <code>INPUT_RECORD<\/code> format\u0131nda gelmesi nedeniyle, \u00f6zel bir ayr\u0131\u015ft\u0131rma ve d\u00f6n\u00fc\u015ft\u00fcrme mant\u0131\u011f\u0131 gerektirir. Aksi takdirde, CLI uygulaman\u0131zdaki fare t\u0131klamalar\u0131 veya \u00f6zel tu\u015f kombinasyonlar\u0131 do\u011fru \u015fekilde \u00e7al\u0131\u015fmayabilir veya hi\u00e7 alg\u0131lanmayabilir. Bu, geli\u015ftiriciler i\u00e7in beklenmedik bir engel te\u015fkil edebilir, zira \u00e7o\u011fu zaman terminal girdi y\u00f6netimini standart VT sekanslar\u0131 \u00fczerinden \u00e7\u00f6zmeye al\u0131\u015fk\u0131nd\u0131rlar. Go&#8217;nun burada devreye girmesi, bu karma\u015f\u0131k Windows API&#8217;leri ile do\u011frudan \u00e7al\u0131\u015fmak i\u00e7in temiz ve verimli bir yol sunmas\u0131d\u0131r.<\/p>\n<h2>Go ile Temel ConPTY Uygulamas\u0131 Olu\u015fturma: \u0130lk Ad\u0131mlar<\/h2>\n<p>Go ile ConPTY uygulamalar\u0131 geli\u015ftirmeye ba\u015flamadan \u00f6nce, temel kavramlar\u0131 anlam\u0131\u015f olmam\u0131z \u00f6nemlidir. \u015eimdi, Go&#8217;yu kullanarak basit bir ConPTY oturumu nas\u0131l ba\u015flat\u0131l\u0131r ve bir alt s\u00fcre\u00e7 (\u00f6rne\u011fin, <code>cmd.exe<\/code>) nas\u0131l \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r ona odaklanal\u0131m. Bu, <code>win32-input-mode<\/code>&#8216;un karma\u015f\u0131kl\u0131klar\u0131na girmeden \u00f6nce, Go&#8217;nun Windows sistem API&#8217;leriyle nas\u0131l etkile\u015fime ge\u00e7ti\u011fini g\u00f6steren ilk ad\u0131md\u0131r. Bu b\u00f6l\u00fcm, okuyucunun konuya a\u015final\u0131\u011f\u0131n\u0131 art\u0131rmak ve temel ConPTY mekanizmas\u0131n\u0131 kavramas\u0131n\u0131 sa\u011flamak i\u00e7in tasarlanm\u0131\u015ft\u0131r.<\/p>\n<p>Go&#8217;da ConPTY ile \u00e7al\u0131\u015fmak, \u00e7o\u011funlukla <code>syscall<\/code> paketini ve Windows API fonksiyonlar\u0131n\u0131 kullanmay\u0131 gerektirir. \u0130lk olarak, bir s\u00f6zde konsol olu\u015fturmak i\u00e7in <code>CreatePseudoConsole<\/code> fonksiyonuna ihtiyac\u0131m\u0131z olacak. Bu fonksiyon, ana uygulama ile alt s\u00fcre\u00e7 aras\u0131nda bir ileti\u015fim k\u00f6pr\u00fcs\u00fc g\u00f6revi g\u00f6recek olan iki adet &#8220;pipe&#8221; (kanallar) gerektirir: biri alt s\u00fcrece girdi g\u00f6ndermek i\u00e7in, di\u011feri de alt s\u00fcre\u00e7ten \u00e7\u0131kt\u0131 almak i\u00e7in. Bu pipe&#8217;lar, bizim Go uygulamam\u0131z\u0131n alt s\u00fcre\u00e7le etkile\u015fim kurmas\u0131n\u0131 sa\u011flayacak temel mekanizmalard\u0131r. Ayr\u0131ca, alt s\u00fcrecin ba\u015flang\u0131\u00e7 bilgilerini tan\u0131mlayan <code>STARTUPINFOEX<\/code> yap\u0131s\u0131n\u0131 ve s\u00fcrecin kendisini kontrol etmek i\u00e7in <code>PROCESS_INFORMATION<\/code> yap\u0131s\u0131n\u0131 kullanaca\u011f\u0131z.<\/p>\n<p>A\u015fa\u011f\u0131daki kod blo\u011fu, Go ile basit bir ConPTY oturumu ba\u015flat\u0131p, <code>cmd.exe<\/code>&#8216;yi bu oturum i\u00e7inde \u00e7al\u0131\u015ft\u0131ran temel bir iskeleti g\u00f6stermektedir. Bu \u00f6rnekte, alt s\u00fcre\u00e7ten gelen \u00e7\u0131kt\u0131lar\u0131 okuyaca\u011f\u0131z ve bizim uygulamam\u0131zdan alt s\u00fcrece girdi g\u00f6nderebilece\u011fiz. Ancak, bu a\u015famada <code>win32-input-mode<\/code>&#8216;un yaratt\u0131\u011f\u0131 spesifik girdi sorunlar\u0131na hen\u00fcz de\u011finmiyoruz, sadece temel ileti\u015fimi kurmaya odaklan\u0131yoruz. Kodda g\u00f6r\u00fclece\u011fi \u00fczere, bir\u00e7ok Windows API \u00e7a\u011fr\u0131s\u0131 ve pointer (i\u015faret\u00e7i) manip\u00fclasyonu bulunmaktad\u0131r. Bu, Go&#8217;nun d\u00fc\u015f\u00fck seviyeli sistem programlama yeteneklerinin bir g\u00f6stergesidir.<\/p>\n<pre><code class=\"language-go\">\npackage main\n\nimport (\n    \"fmt\"\n    \"os\"\n    \"syscall\"\n    \"unsafe\"\n)\n\nvar (\n    kernel32           = syscall.NewLazyDLL(\"kernel32.dll\")\n    createPseudoConsole         = kernel32.NewProc(\"CreatePseudoConsole\")\n    closePseudoConsole          = kernel32.NewProc(\"ClosePseudoConsole\")\n    resizePseudoConsole         = kernel32.NewProc(\"ResizePseudoConsole\")\n    createPipe                  = kernel32.NewProc(\"CreatePipe\")\n    getConsoleScreenBufferInfo  = kernel32.NewProc(\"GetConsoleScreenBufferInfo\")\n)\n\nconst (\n    \/\/ Geni\u015f ve \u00f6zl\u00fc sabitler\n    STARTF_USESTDHANDLES = 0x00000100\n    STARTF_USESHOWWINDOW = 0x00000001\n    SW_SHOW              = 5\n    CREATE_UNICODE_ENVIRONMENT = 0x00000400\n    EXTENDED_STARTUPINFO_PRESENT = 0x00080000\n    MAX_PATH = 260\n    INVALID_HANDLE_VALUE = ^syscall.Handle(0)\n)\n\ntype COORD struct {\n    X short\n    Y short\n}\n\ntype SMALL_RECT struct {\n    Left   short\n    Top    short\n    Right  short\n    Bottom short\n}\n\ntype CONSOLE_SCREEN_BUFFER_INFO struct {\n    dwSize              COORD\n    dwCursorPosition    COORD\n    wAttributes         uint16\n    srWindow            SMALL_RECT\n    dwMaximumWindowSize COORD\n}\n\n\/\/ Win32 API \u00e7a\u011fr\u0131lar\u0131 i\u00e7in yard\u0131mc\u0131 fonksiyonlar\n\/\/ ... (STRUCT YAPILARI VE YARDIMCI FONKS\u0130YONLAR EKLECEK) ...\n\/\/ Bu b\u00f6l\u00fcm, makale uzunlu\u011fu i\u00e7in daha fazla struct ve yard\u0131mc\u0131 fonksiyon tan\u0131m\u0131 i\u00e7erebilir.\n\/\/ \u00d6rne\u011fin, STARTUPINFOEX, PROCESS_INFORMATION, SECURITY_ATTRIBUTES gibi yap\u0131lar.\n\nfunc createConPTY() (syscall.Handle, syscall.Handle, syscall.Handle, error) {\n    var (\n        inputRead  syscall.Handle\n        inputWrite syscall.Handle\n        outputRead syscall.Handle\n        outputWrite syscall.Handle\n    )\n\n    \/\/ Alt s\u00fcrece girdi g\u00f6ndermek i\u00e7in pipe\n    err := syscall.CreatePipe(&inputRead, &inputWrite, nil, 0)\n    if err != nil {\n        return 0, 0, 0, fmt.Errorf(\"girdi pipe olu\u015fturulamad\u0131: %w\", err)\n    }\n\n    \/\/ Alt s\u00fcre\u00e7ten \u00e7\u0131kt\u0131 almak i\u00e7in pipe\n    err = syscall.CreatePipe(&outputRead, &outputWrite, nil, 0)\n    if err != nil {\n        syscall.CloseHandle(inputRead)\n        syscall.CloseHandle(inputWrite)\n        return 0, 0, 0, fmt.Errorf(\"\u00e7\u0131kt\u0131 pipe olu\u015fturulamad\u0131: %w\", err)\n    }\n\n    \/\/ Konsol ekran boyutu bilgisi al\n    var csbi CONSOLE_SCREEN_BUFFER_INFO\n    r1, _, err := getConsoleScreenBufferInfo.Call(uintptr(syscall.Stdout), uintptr(unsafe.Pointer(&csbi)))\n    if r1 == 0 {\n        return 0, 0, 0, fmt.Errorf(\"konsol bilgisi al\u0131namad\u0131: %w\", err)\n    }\n\n    \/\/ ConPTY olu\u015ftur\n    var pseudoConsoleHandle syscall.Handle\n    r1, _, err = createPseudoConsole.Call(\n        uintptr(csbi.dwSize.X), \/\/ Geni\u015flik\n        uintptr(csbi.dwSize.Y), \/\/ Y\u00fckseklik\n        uintptr(inputRead),\n        uintptr(outputWrite),\n        uintptr(unsafe.Pointer(&pseudoConsoleHandle)),\n    )\n    if r1 == 0 {\n        syscall.CloseHandle(inputRead)\n        syscall.CloseHandle(inputWrite)\n        syscall.CloseHandle(outputRead)\n        syscall.CloseHandle(outputWrite)\n        return 0, 0, 0, fmt.Errorf(\"pseudo console olu\u015fturulamad\u0131: %w\", err)\n    }\n\n    return pseudoConsoleHandle, inputWrite, outputRead, nil\n}\n\nfunc main() {\n    pseudoConsoleHandle, inputWriter, outputReader, err := createConPTY()\n    if err != nil {\n        fmt.Fprintf(os.Stderr, \"Hata: %v\\n\", err)\n        return\n    }\n    defer closePseudoConsole.Call(uintptr(pseudoConsoleHandle))\n    defer syscall.CloseHandle(inputWriter)\n    defer syscall.CloseHandle(outputReader)\n\n    fmt.Println(\"ConPTY ba\u015far\u0131yla olu\u015fturuldu. cmd.exe ba\u015flat\u0131l\u0131yor...\")\n\n    \/\/ TODO: Alt s\u00fcreci ba\u015flatma kodu buraya eklenecek\n    \/\/ \u00d6rne\u011fin, cmd.exe'yi pseudoConsoleHandle ile ili\u015fkilendirerek \u00e7al\u0131\u015ft\u0131rmak.\n    \/\/ Bu k\u0131s\u0131m sonraki b\u00f6l\u00fcmlerde detayland\u0131r\u0131lacakt\u0131r.\n\n    \/\/ Basit bir \u00e7\u0131kt\u0131 okuyucu (\u00f6rnek ama\u00e7l\u0131)\n    outputBuf := make([]byte, 1024)\n    for {\n        var n uint32\n        err := syscall.ReadFile(outputReader, outputBuf, &n, nil)\n        if err != nil {\n            \/\/ fmt.Println(\"Hata okuma \u00e7\u0131kt\u0131s\u0131:\", err)\n            break \/\/ Genellikle pipe kapat\u0131ld\u0131\u011f\u0131nda bu hata al\u0131n\u0131r\n        }\n        if n > 0 {\n            os.Stdout.Write(outputBuf[:n])\n        }\n    }\n\n    fmt.Println(\"Uygulama tamamland\u0131.\")\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, temel pipe'lar olu\u015fturulur ve <code>CreatePseudoConsole<\/code> \u00e7a\u011fr\u0131l\u0131r. <code>main<\/code> fonksiyonunda ise, olu\u015fturulan <code>pseudoConsoleHandle<\/code>'\u0131 kullanarak bir alt s\u00fcreci nas\u0131l ba\u015flataca\u011f\u0131m\u0131z\u0131n yeri belirtilmi\u015ftir. Dikkat edilmesi gereken \u00f6nemli bir nokta, ConPTY'nin \"geni\u015flik\" ve \"y\u00fckseklik\" gibi konsol boyut parametrelerine ihtiya\u00e7 duymas\u0131d\u0131r. Bu bilgiler genellikle mevcut konsolun boyutlar\u0131ndan al\u0131n\u0131r. Bu boyutlar, alt s\u00fcrecin kendisini do\u011fru bir \u015fekilde render etmesi i\u00e7in kritiktir.<\/p>\n<p>Bu temel kurulum, ConPTY'nin Go'daki mekani\u011fini anlaman\u0131n ilk ad\u0131m\u0131d\u0131r. <code>inputWriter<\/code> ve <code>outputReader<\/code> pipe'lar\u0131 arac\u0131l\u0131\u011f\u0131yla alt s\u00fcre\u00e7le iki y\u00f6nl\u00fc ileti\u015fimi kurmu\u015f oluruz. Alt s\u00fcrecin ba\u015flat\u0131lmas\u0131, <code>CreateProcess<\/code> veya <code>CreateProcessW<\/code> gibi Windows API fonksiyonlar\u0131 kullan\u0131larak ger\u00e7ekle\u015ftirilir. Bu fonksiyonlar, <code>STARTUPINFOEX<\/code> yap\u0131s\u0131n\u0131n bir par\u00e7as\u0131 olarak <code>pseudoConsoleHandle<\/code>'\u0131 alacak \u015fekilde yap\u0131land\u0131r\u0131lmal\u0131d\u0131r. Bu sayede, ba\u015flat\u0131lan alt s\u00fcre\u00e7, bizim kontrol\u00fcm\u00fczdeki s\u00f6zde konsol ortam\u0131nda \u00e7al\u0131\u015fmaya ba\u015flar.<\/p>\n<p>\n  <ExpertTip>Uzman \u0130pucu: ConPTY ile \u00e7al\u0131\u015f\u0131rken <code>syscall<\/code> paketini yo\u011fun bir \u015fekilde kullanmak, kodunuzu Windows'a \u00f6zg\u00fc API'lere ba\u011f\u0131ml\u0131 hale getirecektir. \u00c7apraz platform deste\u011fi ar\u0131yorsan\u0131z, platforma \u00f6zg\u00fc soyutlama katmanlar\u0131 olu\u015fturmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<\/ExpertTip>\n<\/p>\n<p>Bu a\u015famada, Go uygulamam\u0131z\u0131n alt s\u00fcre\u00e7le ileti\u015fim kurmaya haz\u0131r oldu\u011funu g\u00f6r\u00fcyoruz. Ancak, bu temel kurulum, <code>win32-input-mode<\/code>'un getirdi\u011fi \u00f6zel girdi sorunlar\u0131n\u0131 do\u011frudan ele almaz. Sadece ham girdi ve \u00e7\u0131kt\u0131 ak\u0131\u015flar\u0131n\u0131 y\u00f6netiriz. <code>win32-input-mode<\/code>'un neden ve nas\u0131l bir sorun te\u015fkil etti\u011fini anlamak i\u00e7in bir sonraki b\u00f6l\u00fcme ge\u00e7meliyiz. Burada, fare t\u0131klamalar\u0131, tu\u015f basmalar\u0131 gibi olaylar\u0131n <code>INPUT_RECORD<\/code> format\u0131nda nas\u0131l geldi\u011fini ve bunun geleneksel VT sekanslar\u0131ndan fark\u0131n\u0131 inceleyece\u011fiz.<\/p>\n<h2>win32-input-mode'un Detaylar\u0131 ve Kar\u015f\u0131la\u015f\u0131lan Zorluklar<\/h2>\n<p>Yukar\u0131daki b\u00f6l\u00fcmde Go ile temel bir ConPTY oturumu olu\u015fturmay\u0131 ve bir alt s\u00fcreci ba\u015flatmay\u0131 \u00f6\u011frendik. \u015eimdi ise, terminal uygulamalar\u0131 geli\u015ftirirken ba\u015f\u0131m\u0131z\u0131 a\u011fr\u0131tan as\u0131l meseleye, yani <code>win32-input-mode<\/code>'un detaylar\u0131na ve onunla gelen zorluklara odaklanaca\u011f\u0131z. Bu mod, \u00f6zellikle Windows Terminal kullan\u0131ld\u0131\u011f\u0131nda ve interaktif CLI uygulamalar\u0131 s\u00f6z konusu oldu\u011funda kritik bir fark yarat\u0131r. Anlamak i\u00e7in, \u00f6ncelikle standart terminal girdi mekanizmalar\u0131ndan neden farkl\u0131la\u015ft\u0131\u011f\u0131n\u0131 derinlemesine incelememiz gerekiyor.<\/p>\n<p>Geleneksel terminal uygulamalar\u0131 ve em\u00fclat\u00f6rleri genellikle VT (Virtual Terminal) sekanslar\u0131 ad\u0131 verilen standartla\u015ft\u0131r\u0131lm\u0131\u015f escape kodlar\u0131n\u0131 kullanarak girdi ve \u00e7\u0131kt\u0131 i\u015flemlerini ger\u00e7ekle\u015ftirir. \u00d6rne\u011fin, bir ok tu\u015funa bas\u0131ld\u0131\u011f\u0131nda <code>\\x1b[A<\/code> gibi bir sekans g\u00f6nderilirken, fare t\u0131klamalar\u0131 i\u00e7in de SGR (Select Graphic Rendition) fare raporlama format\u0131 gibi VT tabanl\u0131 sekanslar kullan\u0131l\u0131r. Bu standart, \u00e7o\u011fu terminal uygulamas\u0131n\u0131n platform ba\u011f\u0131ms\u0131z bir \u015fekilde etkile\u015fim kurmas\u0131n\u0131 sa\u011flar. Ancak Windows Terminal, <code>win32-input-mode<\/code> etkin oldu\u011funda, bu geleneksel yakla\u015f\u0131m\u0131n d\u0131\u015f\u0131na \u00e7\u0131kar.<\/p>\n<p>Peki, <code>win32-input-mode<\/code> ne zaman ve neden aktive olur? Temelde, bir ConPTY oturumu olu\u015fturuldu\u011funda ve bu oturum bir Windows Terminal penceresi taraf\u0131ndan bar\u0131nd\u0131r\u0131ld\u0131\u011f\u0131nda, Windows Terminal, alt s\u00fcrece daha zengin ve detayl\u0131 girdi bilgileri sa\u011flamak amac\u0131yla bu modu kullanmay\u0131 tercih edebilir. Bu modun amac\u0131, klasik Windows konsol uygulamalar\u0131n\u0131n al\u0131\u015f\u0131k oldu\u011fu <code>INPUT_RECORD<\/code> yap\u0131s\u0131n\u0131 kullanarak girdileri aktarmakt\u0131r. Bu yap\u0131, bir klavye tu\u015funun bas\u0131l\u0131p bas\u0131lmad\u0131\u011f\u0131, fare tekerle\u011finin kayd\u0131r\u0131l\u0131p kayd\u0131r\u0131lmad\u0131\u011f\u0131, imlecin nerede oldu\u011fu gibi \u00e7ok daha gran\u00fcler bilgileri i\u00e7erir. Yani, terminal uygulaman\u0131z \"bir tu\u015fa bas\u0131ld\u0131\" bilgisini almak yerine, \"sol Shift tu\u015fu bas\u0131l\u0131yken 'A' tu\u015funa bas\u0131ld\u0131, imle\u00e7 (X,Y) konumundayd\u0131\" gibi detayl\u0131 bir bilgi paketi al\u0131r.<\/p>\n<p>Bu durumun getirdi\u011fi en b\u00fcy\u00fck zorluk, bizim Go uygulamam\u0131z\u0131n (veya ConPTY arac\u0131l\u0131\u011f\u0131yla ileti\u015fim kurdu\u011fumuz alt s\u00fcrecin) bu <code>INPUT_RECORD<\/code> format\u0131ndaki girdileri do\u011fru bir \u015fekilde ayr\u0131\u015ft\u0131rmas\u0131 ve e\u011fer gerekiyorsa, bunlar\u0131 standart VT sekanslar\u0131na d\u00f6n\u00fc\u015ft\u00fcrmesidir. E\u011fer bunu yapmazsak, alt s\u00fcrecimiz fare t\u0131klamalar\u0131n\u0131, \u00f6zel tu\u015f kombinasyonlar\u0131n\u0131 (Ctrl+C, Ctrl+V hari\u00e7) veya pencere yeniden boyutland\u0131rma olaylar\u0131n\u0131 alg\u0131layamaz. \u00d6rne\u011fin, <code>htop<\/code> veya <code>gitui<\/code> gibi fare etkile\u015fimli veya karma\u015f\u0131k tu\u015f kombinasyonlar\u0131 gerektiren bir CLI arac\u0131 yazd\u0131\u011f\u0131n\u0131z\u0131 d\u00fc\u015f\u00fcn\u00fcn. Kullan\u0131c\u0131 fare ile bir men\u00fc \u00f6\u011fesine t\u0131klad\u0131\u011f\u0131nda veya bir paneli kayd\u0131rd\u0131\u011f\u0131nda, uygulaman\u0131z hi\u00e7bir tepki vermeyecektir \u00e7\u00fcnk\u00fc bekledi\u011fi VT sekanslar\u0131 yerine, <code>INPUT_RECORD<\/code> format\u0131nda bir veri ak\u0131\u015f\u0131 geliyordur ve uygulama bunu yorumlayamaz.<\/p>\n<p><code>INPUT_RECORD<\/code> yap\u0131s\u0131 asl\u0131nda bir union (birle\u015fim) i\u00e7erir ve farkl\u0131 girdi olaylar\u0131 i\u00e7in farkl\u0131 alt yap\u0131lar bar\u0131nd\u0131r\u0131r:<\/p>\n<ul>\n<li><code>KEY_EVENT_RECORD<\/code>: Klavye tu\u015f basmalar\u0131 ve b\u0131rakmalar\u0131 i\u00e7in. Hangi tu\u015fun bas\u0131ld\u0131\u011f\u0131, tu\u015fun ASCII veya Unicode de\u011feri, kontrol tu\u015flar\u0131n\u0131n (Shift, Ctrl, Alt) durumu gibi bilgiler i\u00e7erir.<\/li>\n<li><code>MOUSE_EVENT_RECORD<\/code>: Fare hareketleri, t\u0131klamalar\u0131 ve tekerlek kayd\u0131rmalar\u0131 i\u00e7in. \u0130mlecin konumu, hangi fare tu\u015funun bas\u0131l\u0131 oldu\u011fu, fare tekerle\u011finin ne kadar kayd\u0131r\u0131ld\u0131\u011f\u0131 gibi detaylar\u0131 bar\u0131nd\u0131r\u0131r.<\/li>\n<li><code>WINDOW_BUFFER_SIZE_EVENT_RECORD<\/code>: Konsol penceresinin yeniden boyutland\u0131r\u0131lmas\u0131 gibi olaylar i\u00e7in.<\/li>\n<li><code>MENU_EVENT_RECORD<\/code>: Uygulama men\u00fcleri ile ilgili olaylar i\u00e7in (daha az kullan\u0131l\u0131r).<\/li>\n<li><code>FOCUS_EVENT_RECORD<\/code>: Konsol penceresinin odaklan\u0131p odaklanmad\u0131\u011f\u0131 ile ilgili olaylar i\u00e7in.<\/li>\n<\/ul>\n<p>Go uygulamam\u0131z, ConPTY'nin \"\u00e7\u0131kt\u0131\" pipe'\u0131ndan okurken, bu <code>INPUT_RECORD<\/code> yap\u0131lar\u0131n\u0131 bayt ak\u0131\u015f\u0131 olarak alacakt\u0131r. Bu bayt ak\u0131\u015f\u0131n\u0131 al\u0131p do\u011fru <code>INPUT_RECORD<\/code> yap\u0131s\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek, ard\u0131ndan i\u00e7indeki <code>KEY_EVENT_RECORD<\/code> veya <code>MOUSE_EVENT_RECORD<\/code> alt yap\u0131lar\u0131n\u0131 inceleyerek anlaml\u0131 olaylar\u0131 \u00e7\u0131karmak ve son olarak bunlar\u0131 CLI uygulamas\u0131n\u0131n bekledi\u011fi VT sekanslar\u0131na \u00e7evirmek, Go geli\u015ftiricileri i\u00e7in \u00f6nemli bir g\u00f6rev haline gelir. Bu \u00e7eviri s\u00fcreci hem hata potansiyeli ta\u015f\u0131r hem de performans a\u00e7\u0131s\u0131ndan dikkatli optimizasyon gerektirebilir. \u00d6zellikle fare olaylar\u0131n\u0131 SGR format\u0131na \u00e7evirmek veya \u00f6zel tu\u015flar\u0131 uygun ANSI sekanslar\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek, detayl\u0131 bir e\u015fleme tablosu ve mant\u0131k gerektirir. Bu karma\u015f\u0131kl\u0131k, Go'nun sistem programlama yeteneklerini ve dikkatli bayt manip\u00fclasyonunu gerektiren bir aland\u0131r. Bu durum, sadece Go'ya \u00f6zg\u00fc bir sorun de\u011fil, ConPTY ile etkile\u015fime ge\u00e7en her dilde kar\u015f\u0131la\u015f\u0131labilecek genel bir Windows Terminal \u00f6zg\u00fcl\u00fc\u011f\u00fcd\u00fcr.<\/p>\n<h2>Go'da win32-input-mode Girdilerini Ayr\u0131\u015ft\u0131rma ve Normalle\u015ftirme<\/h2>\n<p>\u00d6nceki b\u00f6l\u00fcmde <code>win32-input-mode<\/code>'un ne oldu\u011funu ve neden <code>INPUT_RECORD<\/code> yap\u0131s\u0131nda girdiler g\u00f6nderdi\u011fini anlad\u0131k. \u015eimdi, Go uygulamam\u0131z\u0131n bu <code>INPUT_RECORD<\/code> yap\u0131lar\u0131n\u0131 nas\u0131l okuyaca\u011f\u0131n\u0131, ayr\u0131\u015ft\u0131raca\u011f\u0131n\u0131 ve gerekirse standart VT sekanslar\u0131na nas\u0131l d\u00f6n\u00fc\u015ft\u00fcrece\u011fini detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Bu, interaktif CLI uygulamalar\u0131m\u0131z\u0131n Windows Terminal ortam\u0131nda beklendi\u011fi gibi \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamak i\u00e7in hayati bir ad\u0131md\u0131r. Amac\u0131m\u0131z, Go'nun g\u00fc\u00e7l\u00fc sistem programlama yeteneklerini kullanarak, bu d\u00fc\u015f\u00fck seviyeli Windows API girdilerini y\u00fcksek seviyeli, terminal dostu \u00e7\u0131kt\u0131lara \u00e7evirmektir.<\/p>\n<p>ConPTY'nin \u00e7\u0131kt\u0131 pipe'\u0131ndan okudu\u011fumuzda, <code>INPUT_RECORD<\/code> yap\u0131lar\u0131n\u0131 i\u00e7eren bir bayt ak\u0131\u015f\u0131 elde ederiz. Bu yap\u0131, Go'da kar\u015f\u0131l\u0131k gelen Go struct'lar\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fclmelidir. Bu d\u00f6n\u00fc\u015f\u00fcm, <code>binary.Read<\/code> veya <code>unsafe.Pointer<\/code> kullan\u0131larak manuel bayt manip\u00fclasyonu ile yap\u0131labilir. <code>INPUT_RECORD<\/code> kendisi bir <code>union<\/code> i\u00e7erdi\u011fi i\u00e7in, hangi alt yap\u0131n\u0131n (<code>KEY_EVENT_RECORD<\/code>, <code>MOUSE_EVENT_RECORD<\/code> vb.) aktif oldu\u011funu belirlemek i\u00e7in <code>EventType<\/code> alan\u0131n\u0131 kontrol etmemiz gerekir. Bu sayede do\u011fru alt yap\u0131y\u0131 ayr\u0131\u015ft\u0131rabiliriz.<\/p>\n<p>\u0130lk ad\u0131m, <code>INPUT_RECORD<\/code> ve onun alt yap\u0131lar\u0131n\u0131n Go'daki temsillerini tan\u0131mlamakt\u0131r. Bu yap\u0131lar, Windows SDK's\u0131ndaki tan\u0131mlara birebir uygun olmal\u0131d\u0131r. \u00d6zellikle veri t\u00fcrlerinin boyutlar\u0131 (<code>short<\/code>, <code>int32<\/code>, <code>uint16<\/code> vb.) do\u011fru e\u015fle\u015fmelidir, aksi takdirde yanl\u0131\u015f bayt okumalar\u0131yla kar\u015f\u0131la\u015f\u0131r\u0131z.<\/p>\n<pre><code class=\"language-go\">\n\/\/ win32api_types.go (ayr\u0131 bir dosyada veya ana dosyan\u0131n ba\u015flang\u0131c\u0131nda tan\u0131mlanabilir)\npackage main\n\nimport \"syscall\"\n\n\/\/ COORD struct, X ve Y koordinatlar\u0131 i\u00e7in\ntype COORD struct {\n    X short\n    Y short\n}\n\n\/\/ KEY_EVENT_RECORD i\u00e7in gerekli flag'ler\nconst (\n    FROM_LEFT_1ST_BUTTON_PRESSED = 0x0001\n    RIGHTMOST_BUTTON_PRESSED     = 0x0002\n    FROM_LEFT_2ND_BUTTON_PRESSED = 0x0004\n    FROM_LEFT_3RD_BUTTON_PRESSED = 0x0008\n    FROM_LEFT_4TH_BUTTON_PRESSED = 0x0010\n    \n    \/\/ Klavye kontrol tu\u015flar\u0131\n    CAPSLOCK_ON        = 0x0080\n    ENHANCED_KEY       = 0x0100\n    LEFT_ALT_PRESSED   = 0x0002\n    LEFT_CTRL_PRESSED  = 0x0008\n    NUMLOCK_ON         = 0x0020\n    RIGHT_ALT_PRESSED  = 0x0001\n    RIGHT_CTRL_PRESSED = 0x0004\n    SCROLLLOCK_ON      = 0x0040\n    SHIFT_PRESSED      = 0x0010\n)\n\n\/\/ Event t\u00fcrleri\nconst (\n    KEY_EVENT         = 0x0001\n    MOUSE_EVENT       = 0x0002\n    WINDOW_BUFFER_SIZE_EVENT = 0x0004\n    \/\/ Di\u011fer event t\u00fcrleri de eklenebilir\n)\n\ntype KEY_EVENT_RECORD struct {\n    bKeyDown          int32 \/\/ 0: Key up, 1: Key down\n    wRepeatCount      uint16\n    wVirtualKeyCode   uint16\n    wVirtualScanCode  uint16\n    U_Char            uint16 \/\/ Union: UnicodeChar or AsciiChar\n    dwControlKeyState uint32\n}\n\ntype MOUSE_EVENT_RECORD struct {\n    dwMousePosition COORD\n    dwButtonState   uint32\n    dwControlKeyState uint32\n    dwEventFlags    uint32\n}\n\ntype WINDOW_BUFFER_SIZE_RECORD struct {\n    dwSize COORD\n}\n\ntype INPUT_RECORD struct {\n    EventType uint16\n    _         uint16 \/\/ Padding\n    Event     [16]byte \/\/ Union i\u00e7in ham bayt alan\u0131, 16 bayt en b\u00fcy\u00fck olay\u0131n boyutu\n}\n\n\/\/ Di\u011fer win32 structlar\u0131 ve typedef'leri eklenebilir (\u00f6rne\u011fin short int32 gibi)\ntype short int16 \/\/ Windows'daki SHORT int16'ya kar\u015f\u0131l\u0131k gelir\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki yap\u0131lar\u0131 tan\u0131mlad\u0131ktan sonra, ConPTY'nin \u00e7\u0131kt\u0131 pipe'\u0131ndan okudu\u011fumuz baytlar\u0131 bu <code>INPUT_RECORD<\/code> yap\u0131s\u0131na d\u00f6n\u00fc\u015ft\u00fcrmemiz gerekir. Ard\u0131ndan <code>EventType<\/code> alan\u0131na bakarak hangi olay\u0131n geldi\u011fini belirler ve ilgili alt yap\u0131y\u0131 ayr\u0131\u015ft\u0131r\u0131r\u0131z. \u0130\u015fte temel bir ayr\u0131\u015ft\u0131rma d\u00f6ng\u00fcs\u00fc:<\/p>\n<pre><code class=\"language-go\">\n\/\/ main.go i\u00e7inde, outputReader'dan okuma d\u00f6ng\u00fcs\u00fcn\u00fcn bir par\u00e7as\u0131 olarak\nfunc processInputRecords(outputReader syscall.Handle, inputWriter syscall.Handle) {\n    recordSize := unsafe.Sizeof(INPUT_RECORD{})\n    inputBuffer := make([]byte, recordSize)\n\n    for {\n        var n uint32\n        \/\/ ConPTY'den INPUT_RECORD okuma\n        err := syscall.ReadFile(outputReader, inputBuffer, &n, nil)\n        if err != nil {\n            \/\/ Hata y\u00f6netimi: Pipe kapat\u0131ld\u0131\u011f\u0131nda veya ba\u015fka bir hata oldu\u011funda \u00e7\u0131k\n            if err == syscall.ERROR_BROKEN_PIPE {\n                fmt.Println(\"ConPTY \u00e7\u0131kt\u0131 pipe'\u0131 kapat\u0131ld\u0131.\")\n            } else {\n                fmt.Fprintf(os.Stderr, \"INPUT_RECORD okuma hatas\u0131: %v\\n\", err)\n            }\n            return\n        }\n\n        if n == uint32(recordSize) {\n            record := (*INPUT_RECORD)(unsafe.Pointer(&inputBuffer[0]))\n            \n            \/\/ Event t\u00fcr\u00fcne g\u00f6re ayr\u0131\u015ft\u0131rma\n            switch record.EventType {\n            case KEY_EVENT:\n                keyEvent := (*KEY_EVENT_RECORD)(unsafe.Pointer(&record.Event[0]))\n                if keyEvent.bKeyDown != 0 { \/\/ Sadece tu\u015fa basma olaylar\u0131n\u0131 i\u015fleyelim\n                    vtSeq := convertKeyEventToVT(keyEvent)\n                    if len(vtSeq) > 0 {\n                        \/\/ D\u00f6n\u00fc\u015ft\u00fcr\u00fclen VT sekans\u0131n\u0131 alt s\u00fcrece yaz\n                        \/\/ NOTE: Bu VT sekans\u0131 genellikle ana terminale (os.Stdout) yaz\u0131l\u0131r,\n                        \/\/ alt s\u00fcrece de\u011fil. E\u011fer alt s\u00fcre\u00e7 de VT bekliyorsa buraya yaz\u0131l\u0131r.\n                        \/\/ \u00c7o\u011fu durumda, ConPTY kendisi alt s\u00fcrece Win32 olay\u0131n\u0131 iletir.\n                        \/\/ Bizim amac\u0131m\u0131z, e\u011fer ara katmanda bu olay\u0131 kendimiz i\u015fleyip\n                        \/\/ ba\u015fka bir yere (\u00f6rn. ba\u015fka bir pty'ye) iletmekse bu d\u00f6n\u00fc\u015f\u00fcm mant\u0131kl\u0131.\n                        os.Stdout.Write([]byte(vtSeq))\n                    }\n                }\n            case MOUSE_EVENT:\n                mouseEvent := (*MOUSE_EVENT_RECORD)(unsafe.Pointer(&record.Event[0]))\n                vtSeq := convertMouseEventToVT(mouseEvent)\n                if len(vtSeq) > 0 {\n                    os.Stdout.Write([]byte(vtSeq))\n                }\n            case WINDOW_BUFFER_SIZE_EVENT:\n                sizeEvent := (*WINDOW_BUFFER_SIZE_RECORD)(unsafe.Pointer(&record.Event[0]))\n                \/\/ Pencere yeniden boyutland\u0131rma olay\u0131n\u0131 i\u015fleme\n                \/\/ \u00d6rne\u011fin, <code>os.Stdout.Write([]byte(fmt.Sprintf(\"\\x1b[8;%d;%dt\", sizeEvent.dwSize.Y, sizeEvent.dwSize.X)))<\/code>\n                fmt.Printf(\"Pencere boyutu de\u011fi\u015fti: %dx%d\\n\", sizeEvent.dwSize.X, sizeEvent.dwSize.Y)\n                \/\/ ResizePseudoConsole \u00e7a\u011fr\u0131s\u0131 yap\u0131labilir\n                \/\/ resizePseudoConsole.Call(uintptr(pseudoConsoleHandle), uintptr(sizeEvent.dwSize.X), uintptr(sizeEvent.dwSize.Y))\n            \/\/ Di\u011fer event t\u00fcrleri i\u00e7in case'ler eklenebilir\n            }\n        } else if n > 0 {\n            fmt.Fprintf(os.Stderr, \"Beklenenden farkl\u0131 boyutta INPUT_RECORD okundu: %d bayt\\n\", n)\n        }\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi en kritik k\u0131sma gelelim: <code>KEY_EVENT_RECORD<\/code> ve <code>MOUSE_EVENT_RECORD<\/code>'u standart VT sekanslar\u0131na d\u00f6n\u00fc\u015ft\u00fcrme. Bu d\u00f6n\u00fc\u015f\u00fcm, genellikle b\u00fcy\u00fck bir <code>switch<\/code> ifadesi veya e\u015fleme tablosu gerektirir. Her tu\u015f kombinasyonu ve fare olay\u0131 i\u00e7in belirli bir VT sekans\u0131 vard\u0131r.<\/p>\n<p>\n  <ExpertTip>Uzman \u0130pucu: <code>unsafe.Pointer<\/code> kullan\u0131m\u0131 Go'da dikkatli olmay\u0131 gerektirir. Performans i\u00e7in gerekli olabilir ancak yanl\u0131\u015f kullan\u0131mda haf\u0131za hatalar\u0131na yol a\u00e7abilir. Alternatif olarak <code>encoding\/binary<\/code> paketini kullanarak daha g\u00fcvenli ama potansiyel olarak biraz daha yava\u015f bir yol izleyebilirsiniz.<\/ExpertTip>\n<\/p>\n<h3>Klavye Girdilerini VT Sekanslar\u0131na \u00c7evirme<\/h3>\n<p>Klavye girdilerini d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in, <code>KEY_EVENT_RECORD<\/code> yap\u0131s\u0131ndaki <code>wVirtualKeyCode<\/code>, <code>U_Char<\/code> ve <code>dwControlKeyState<\/code> alanlar\u0131na bakar\u0131z. \u00d6rne\u011fin, \"A\" tu\u015funa bas\u0131ld\u0131\u011f\u0131nda <code>U_Char<\/code> alan\u0131 'A' de\u011ferini i\u00e7erecektir. \u00d6zel tu\u015flar (F1-F12, Ok tu\u015flar\u0131, Home, End vb.) i\u00e7in ise <code>wVirtualKeyCode<\/code> alan\u0131n\u0131 kontrol ederiz ve buna g\u00f6re uygun VT sekans\u0131n\u0131 (\u00f6rne\u011fin, F1 i\u00e7in <code>\\x1bOP<\/code> veya ok tu\u015flar\u0131 i\u00e7in <code>\\x1b[A<\/code>) d\u00f6nd\u00fcr\u00fcr\u00fcz. Kontrol tu\u015flar\u0131n\u0131n (Shift, Ctrl, Alt) durumu, <code>dwControlKeyState<\/code> ile belirlenir ve bu da VT sekans\u0131n\u0131n modifiye edilmesine neden olabilir (\u00f6rne\u011fin, Shift+Ok tu\u015fu farkl\u0131 bir sekans verebilir).<\/p>\n<h3>Fare Girdilerini VT Sekanslar\u0131na \u00c7evirme<\/h3>\n<p>Fare olaylar\u0131 biraz daha karma\u015f\u0131kt\u0131r. <code>MOUSE_EVENT_RECORD<\/code> yap\u0131s\u0131ndaki <code>dwMousePosition<\/code>, <code>dwButtonState<\/code> ve <code>dwEventFlags<\/code> alanlar\u0131n\u0131 kullanarak olay\u0131n t\u00fcr\u00fcn\u00fc (t\u0131klama, \u00e7ift t\u0131klama, hareket, tekerlek kayd\u0131rma) ve konumunu belirleriz. Ard\u0131ndan bunlar\u0131 SGR (Set Graphics Rendition) fare raporlama format\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcr\u00fcz. SGR format\u0131 genellikle <code>\\x1b[<button>;<x>;<y>M<\/code> veya <code>\\x1b[<button>;<x>;<y>m<\/code> \u015feklinde olur, burada <code><button><\/code> bas\u0131lan tu\u015fu, <code><x><\/code> ve <code><y><\/code> ise fare imlecinin konumunu temsil eder. Tekerlek kayd\u0131rma olaylar\u0131 da benzer \u015fekilde \u00f6zel VT sekanslar\u0131na \u00e7evrilebilir.<\/p>\n<p>Bu d\u00f6n\u00fc\u015f\u00fcm fonksiyonlar\u0131n\u0131n kod \u00f6rnekleri, makalenin hacmini a\u015faca\u011f\u0131 i\u00e7in burada genel prensipleri a\u00e7\u0131klamakla yetindik. Ancak temel mant\u0131k, gelen Win32 <code>INPUT_RECORD<\/code> verilerini analiz edip, terminal uygulamalar\u0131n\u0131n evrensel dili olan VT sekanslar\u0131na \u00e7evirmektir. Bu sayede, Go ile yazd\u0131\u011f\u0131m\u0131z ConPTY uygulamalar\u0131, Windows Terminal'in \u00f6zel <code>win32-input-mode<\/code>'u kar\u015f\u0131s\u0131nda bile tam i\u015flevsellik sunabilen, interaktif ve modern CLI ara\u00e7lar\u0131 geli\u015ftirmemize olanak tan\u0131r.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: Interaktif Bir CLI Uygulamas\u0131n\u0131 ConPTY \u00dczerinde \u00c7al\u0131\u015ft\u0131rma<\/h2>\n<p>\u015eimdiye kadar, Windows Terminal'in <code>win32-input-mode<\/code>'unun do\u011fas\u0131n\u0131, Go ile temel ConPTY uygulamalar\u0131n\u0131 nas\u0131l olu\u015fturaca\u011f\u0131m\u0131z\u0131 ve <code>INPUT_RECORD<\/code> yap\u0131lar\u0131n\u0131 nas\u0131l ayr\u0131\u015ft\u0131raca\u011f\u0131m\u0131z\u0131 teorik ve temel kod par\u00e7ac\u0131klar\u0131yla inceledik. Art\u0131k bilgimizi ger\u00e7ek d\u00fcnya bir senaryoya uygulayarak peki\u015ftirelim: Interaktif bir CLI uygulamas\u0131n\u0131n ConPTY \u00fczerinde nas\u0131l sorunsuz \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve <code>win32-input-mode<\/code>'dan gelen girdileri nas\u0131l i\u015fledi\u011fini g\u00f6rece\u011fiz. Bu vaka analizi, \u00f6zellikle g\u00f6rsel olarak zengin, fare etkile\u015fimli veya karma\u015f\u0131k tu\u015f kombinasyonlar\u0131 gerektiren uygulamalar geli\u015ftirenler i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p>Bir\u00e7ok modern CLI uygulamas\u0131, <code>htop<\/code>, <code>lazygit<\/code>, <code>fzf<\/code> gibi ara\u00e7lar, kullan\u0131c\u0131 aray\u00fczleri i\u00e7in ncurses veya tcell gibi k\u00fct\u00fcphaneleri kullan\u0131r. Bu k\u00fct\u00fcphaneler genellikle standart VT sekanslar\u0131 beklerler. Dolay\u0131s\u0131yla, Go ConPTY uygulamam\u0131z\u0131n ana g\u00f6revi, <code>win32-input-mode<\/code>'dan gelen <code>INPUT_RECORD<\/code>'lar\u0131 bu k\u00fct\u00fcphanelerin anlayabilece\u011fi VT sekanslar\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek ve ana terminalin (veya bizim Go uygulamam\u0131z\u0131n) \u00e7\u0131kt\u0131 pipe'\u0131na yazmakt\u0131r. Alt s\u00fcre\u00e7 genellikle bu d\u00f6n\u00fc\u015ft\u00fcr\u00fclm\u00fc\u015f VT sekanslar\u0131n\u0131 okuyarak etkile\u015fimi sa\u011flar.<\/p>\n<h3>Vaka Analizi: Basit Bir Fare Destekli Metin G\u00f6r\u00fcnt\u00fcleyici<\/h3>\n<p>Hayali bir senaryo olu\u015ftural\u0131m: Basit bir metin dosyas\u0131n\u0131 g\u00f6r\u00fcnt\u00fcleyen, fare tekerle\u011fi ile kayd\u0131rma ve fare t\u0131klamas\u0131 ile metin se\u00e7me \u00f6zelliklerine sahip bir CLI uygulamas\u0131 geli\u015ftirmek istiyoruz. Bu uygulama, kullan\u0131c\u0131dan gelen fare ve klavye girdilerine duyarl\u0131 olmal\u0131d\u0131r. Uygulaman\u0131n \u00e7ekirde\u011fi Go ile yaz\u0131lm\u0131\u015f ve ConPTY arac\u0131l\u0131\u011f\u0131yla Windows Terminal \u00fczerinde \u00e7al\u0131\u015ft\u0131r\u0131lmaktad\u0131r. \u0130\u015fte ad\u0131mlar\u0131m\u0131z ve kar\u015f\u0131la\u015faca\u011f\u0131m\u0131z zorluklar:<\/p>\n<ol>\n<li><strong>ConPTY Oturumunun Ba\u015flat\u0131lmas\u0131<\/strong>: Go uygulamam\u0131z, daha \u00f6nce anlatt\u0131\u011f\u0131m\u0131z gibi bir ConPTY oturumu olu\u015fturur. Bu oturumda metin g\u00f6r\u00fcnt\u00fcleyici alt s\u00fcrecini \u00e7al\u0131\u015ft\u0131r\u0131r\u0131z. Metin g\u00f6r\u00fcnt\u00fcleyici, standart Girdi (<code>stdin<\/code>), \u00c7\u0131kt\u0131 (<code>stdout<\/code>) ve Hata (<code>stderr<\/code>) ak\u0131\u015flar\u0131n\u0131 kullan\u0131r.<\/li>\n<li><strong>Girdilerin Dinlenmesi<\/strong>: Go uygulamam\u0131z, ConPTY'nin \"input\" pipe'\u0131ndan (yani Windows Terminal'den gelen) <code>INPUT_RECORD<\/code>'lar\u0131 s\u00fcrekli olarak okur. Bu, fare hareketleri, t\u0131klamalar, tekerlek kayd\u0131rmalar\u0131 ve klavye basmalar\u0131n\u0131 i\u00e7erir.<\/li>\n<li><strong><code>INPUT_RECORD<\/code>'lar\u0131n Ayr\u0131\u015ft\u0131r\u0131lmas\u0131<\/strong>: Her <code>INPUT_RECORD<\/code> okundu\u011funda, <code>EventType<\/code> kontrol edilir.<\/li>\n<ul>\n<li>E\u011fer bir <code>KEY_EVENT_RECORD<\/code> ise, Go uygulamam\u0131z bunu uygun bir VT klavye sekans\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcr (\u00f6rne\u011fin, \"a\" tu\u015fu i\u00e7in \"a\", yukar\u0131 ok tu\u015fu i\u00e7in <code>\\x1b[A<\/code>).<\/li>\n<li>E\u011fer bir <code>MOUSE_EVENT_RECORD<\/code> ise, Go uygulamam\u0131z fare konumunu, bas\u0131lan tu\u015fu ve varsa tekerlek kayd\u0131rma bilgisini al\u0131r. Bunu SGR fare raporlama format\u0131na (<code>\\x1b[<button>;<x>;<y>M<\/code>) veya tekerlek olaylar\u0131 i\u00e7in \u00f6zel sekanslara d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<\/li>\n<li><code>WINDOW_BUFFER_SIZE_EVENT_RECORD<\/code> i\u00e7in, pencere boyutunu g\u00fcnceller ve ConPTY'nin boyutunu <code>ResizePseudoConsole<\/code> ile ayarlar\u0131z. Ayr\u0131ca alt s\u00fcrece de bir yeniden boyutland\u0131rma VT sekans\u0131 g\u00f6nderebiliriz (<code>\\x1b[8;<rows>;<cols>t<\/code>), b\u00f6ylece metin g\u00f6r\u00fcnt\u00fcleyici aray\u00fcz\u00fcn\u00fc kendini yeniden d\u00fczenleyebilir.<\/li>\n<\/ul>\n<li><strong>D\u00f6n\u00fc\u015ft\u00fcr\u00fclm\u00fc\u015f Girdilerin Y\u00f6nlendirilmesi<\/strong>: Ayr\u0131\u015ft\u0131r\u0131l\u0131p VT sekanslar\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fclen bu girdiler, alt s\u00fcrecin <code>stdin<\/code>'ine (yani ConPTY'nin \"output\" pipe'\u0131na) yaz\u0131l\u0131r. Bu sayede, metin g\u00f6r\u00fcnt\u00fcleyici uygulamam\u0131z, sanki do\u011frudan standart bir terminalden VT sekanslar\u0131 al\u0131yormu\u015f gibi davran\u0131r.<\/li>\n<li><strong>\u00c7\u0131kt\u0131lar\u0131n Y\u00f6nlendirilmesi<\/strong>: Metin g\u00f6r\u00fcnt\u00fcleyicinin <code>stdout<\/code>'a yazd\u0131\u011f\u0131 VT sekanslar\u0131 (metin, renklendirme, imle\u00e7 hareketleri vb.), ConPTY'nin \"output\" pipe'\u0131ndan Go uygulamam\u0131z taraf\u0131ndan okunur ve do\u011frudan <code>os.Stdout<\/code>'a (yani kullan\u0131c\u0131n\u0131n Windows Terminal penceresine) yaz\u0131l\u0131r.<\/li>\n<\/ol>\n<p>Bu senaryo, Go uygulamas\u0131n\u0131n bir \"ara katman\" (proxy) g\u00f6revi g\u00f6rd\u00fc\u011f\u00fcn\u00fc a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Windows Terminal'in g\u00f6nderdi\u011fi platforma \u00f6zg\u00fc <code>INPUT_RECORD<\/code>'lar\u0131 yakalar, bunlar\u0131 evrensel VT sekanslar\u0131na \u00e7evirir ve alt s\u00fcre\u00e7 olan metin g\u00f6r\u00fcnt\u00fcleyiciye iletir. B\u00f6ylece metin g\u00f6r\u00fcnt\u00fcleyici, Windows Terminal'in karma\u015f\u0131k girdi mekanizmalar\u0131ndan haberdar olmadan, sadece standart VT protokol\u00fcne uygun \u00e7al\u0131\u015fabilir.<\/p>\n<pre><code class=\"language-go\">\n\/\/ processInputRecords i\u00e7inde KEY_EVENT_RECORD'u VT'ye \u00e7evirme \u00f6rne\u011fi\nfunc convertKeyEventToVT(event *KEY_EVENT_RECORD) string {\n    \/\/ \u00d6rnek: Basit ASCII karakterler\n    if event.U_Char >= 32 && event.U_Char <= 126 { \/\/ Bas\u0131labilir ASCII karakterler\n        return string(rune(event.U_Char))\n    }\n\n    \/\/ \u00d6zel tu\u015flar i\u00e7in \u00f6rnek d\u00f6n\u00fc\u015f\u00fcmler\n    switch event.wVirtualKeyCode {\n    case 0x25: \/\/ VK_LEFT\n        return \"\\x1b[D\"\n    case 0x26: \/\/ VK_UP\n        return \"\\x1b[A\"\n    case 0x27: \/\/ VK_RIGHT\n        return \"\\x1b[C\"\n    case 0x28: \/\/ VK_DOWN\n        return \"\\x1b[B\"\n    case 0x0D: \/\/ VK_RETURN\n        return \"\\r\" \/\/ Enter tu\u015fu\n    case 0x08: \/\/ VK_BACK\n        return \"\\x7f\" \/\/ Backspace\n    \/\/ Di\u011fer \u00f6zel tu\u015flar (Home, End, PageUp, PageDown, F1-F12 vb.) i\u00e7in e\u015flemeler buraya eklenecek\n    \/\/ Ctrl, Alt, Shift gibi modifikat\u00f6r tu\u015f durumlar\u0131 da <code>dwControlKeyState<\/code> ile kontrol edilmelidir.\n    \/\/ \u00d6rne\u011fin, Ctrl+C i\u00e7in farkl\u0131 bir sekans olabilir.\n    }\n    return \"\" \/\/ E\u015fle\u015fmeyen tu\u015flar i\u00e7in bo\u015f d\u00f6n\u00fc\u015f\n}\n\n\/\/ processInputRecords i\u00e7inde MOUSE_EVENT_RECORD'u VT'ye \u00e7evirme \u00f6rne\u011fi (SGR format\u0131)\nfunc convertMouseEventToVT(event *MOUSE_EVENT_RECORD) string {\n    buttonState := 0\n    \/\/ Fare tu\u015flar\u0131 ve kayd\u0131rma i\u00e7in bas\u0131lan tu\u015flar\u0131 belirle\n    if (event.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED) != 0 {\n        buttonState = 0 \/\/ Sol t\u0131klama\n    } else if (event.dwButtonState & RIGHTMOST_BUTTON_PRESSED) != 0 {\n        buttonState = 2 \/\/ Sa\u011f t\u0131klama\n    } else if (event.dwButtonState & FROM_LEFT_2ND_BUTTON_PRESSED) != 0 {\n        buttonState = 1 \/\/ Orta t\u0131klama\n    } else if (event.dwEventFlags == 0x0004) { \/\/ MOUSE_WHEELED (tekerlek kayd\u0131rma)\n        \/\/ Tekerlek kayd\u0131rma durumlar\u0131\n        wheelDelta := int16(event.dwButtonState >> 16) \/\/ Fare tekerle\u011fi delta de\u011feri\n        if wheelDelta > 0 {\n            buttonState = 64 \/\/ Yukar\u0131 kayd\u0131rma\n        } else {\n            buttonState = 65 \/\/ A\u015fa\u011f\u0131 kayd\u0131rma\n        }\n        return fmt.Sprintf(\"\\x1b[<%d;%d;%dM\", buttonState, event.dwMousePosition.X+1, event.dwMousePosition.Y+1)\n    }\n\n    \/\/ Fare hareketi olaylar\u0131 i\u00e7in\n    if event.dwEventFlags == 0x0001 { \/\/ MOUSE_MOVED\n        \/\/ E\u011fer herhangi bir tu\u015f bas\u0131l\u0131 de\u011filse ve sadece hareketse, farkl\u0131 bir sekans olabilir\n        \/\/ Standart SGR raporlama hareket i\u00e7in de kullan\u0131l\u0131r.\n        \/\/ Genellikle, sadece tu\u015f bas\u0131l\u0131yken hareket raporlan\u0131r.\n    }\n\n    \/\/ E\u011fer bir tu\u015fa bas\u0131ld\u0131ysa veya b\u0131rak\u0131ld\u0131ysa\n    if event.dwEventFlags == 0 { \/\/ Tu\u015f basma\/b\u0131rakma\n        \/\/ ASCII koda eklemek i\u00e7in 32 kullan\u0131l\u0131r, SGR format\u0131nda.\n        \/\/ Bas\u0131l\u0131 tu\u015flar i\u00e7in M, b\u0131rak\u0131lan tu\u015flar i\u00e7in m.\n        return fmt.Sprintf(\"\\x1b[<%d;%d;%dM\", buttonState, event.dwMousePosition.X+1, event.dwMousePosition.Y+1)\n    }\n\n    return \"\"\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu vaka analizi, <code>win32-input-mode<\/code>'un nas\u0131l bir k\u00f6pr\u00fc g\u00f6revi g\u00f6rd\u00fc\u011f\u00fcm\u00fcz\u00fc ve Go'nun bu k\u00f6pr\u00fcy\u00fc in\u015fa etmek i\u00e7in ne kadar uygun bir dil oldu\u011funu g\u00f6stermektedir. Geli\u015ftiriciler, bu teknikleri kullanarak Windows Terminal'de de Linux\/macOS benzeri zengin ve interaktif CLI deneyimleri sunabilirler. Bu, terminal uygulamalar\u0131n\u0131n platformlar aras\u0131 uyumlulu\u011funu art\u0131rmak ve kullan\u0131c\u0131 deneyimini iyile\u015ftirmek a\u00e7\u0131s\u0131ndan hayati \u00f6neme sahiptir. \u00d6zellikle, karma\u015f\u0131k aray\u00fczlere sahip ara\u00e7lar geli\u015ftirirken, bu ayr\u0131\u015ft\u0131rma ve normalle\u015ftirme ad\u0131m\u0131 vazge\u00e7ilmezdir.<\/p>\n<h2>\u0130leri D\u00fczey Teknikler ve Optimizasyonlar<\/h2>\n<p>Temel ConPTY kurulumunu ve <code>win32-input-mode<\/code> girdilerini ayr\u0131\u015ft\u0131rma y\u00f6ntemlerini \u00f6\u011frendik. \u015eimdi ise, daha deneyimli kullan\u0131c\u0131lar i\u00e7in ConPTY uygulamalar\u0131n\u0131 daha sa\u011flam, performansl\u0131 ve uyumlu hale getirecek ileri d\u00fczey tekniklere ve optimizasyonlara de\u011finece\u011fiz. Bu ipu\u00e7lar\u0131, \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli veya y\u00fcksek performans gerektiren terminal uygulamalar\u0131 geli\u015ftirirken i\u015finize yarayacakt\u0131r.<\/p>\n<h3>1. <code>EnableVirtualTerminalInput<\/code> ve <code>DisableVirtualTerminalInput<\/code> API'leri ile Ge\u00e7i\u015fler<\/h3>\n<p>Windows konsol API'leri, <code>SetConsoleMode<\/code> fonksiyonu ve <code>ENABLE_VIRTUAL_TERMINAL_INPUT<\/code> bayra\u011f\u0131 arac\u0131l\u0131\u011f\u0131yla terminal girdi modlar\u0131n\u0131 dinamik olarak de\u011fi\u015ftirmenize olanak tan\u0131r. ConPTY, varsay\u0131lan olarak <code>win32-input-mode<\/code> ile <code>INPUT_RECORD<\/code> yap\u0131lar\u0131 g\u00f6nderse de, baz\u0131 durumlarda alt s\u00fcre\u00e7 do\u011frudan VT sekanslar\u0131n\u0131 almay\u0131 tercih edebilir. <code>EnableVirtualTerminalInput<\/code> (veya <code>SetConsoleMode<\/code> ile <code>ENABLE_VIRTUAL_TERMINAL_INPUT<\/code>'u etkinle\u015ftirmek), ConPTY'nin bu modda da VT sekanslar\u0131 \u00fcretmesini sa\u011flayabilir. Ancak, bu durumun davran\u0131\u015flar\u0131 ve uyumlulu\u011fu her zaman beklenen gibi olmayabilir ve terminal em\u00fclat\u00f6r\u00fcne g\u00f6re de\u011fi\u015fiklik g\u00f6sterebilir. Bu bayra\u011f\u0131 dikkatli kullanmak ve uygulaman\u0131z\u0131 farkl\u0131 senaryolarda test etmek \u00f6nemlidir. \u00d6zellikle eski terminal em\u00fclat\u00f6rleri veya belirli <code>console host<\/code> s\u00fcr\u00fcmleriyle uyumluluk sorunlar\u0131 ya\u015fanabilir. Bu, Go'daki <code>syscall<\/code> paketi ile <code>kernel32.dll<\/code> \u00e7a\u011fr\u0131larak ger\u00e7ekle\u015ftirilebilir.<\/p>\n<h3>2. Buffer Y\u00f6netimi ve E\u015fzamanl\u0131l\u0131k (Goroutines) Kullan\u0131m\u0131<\/h3>\n<p>Girdi ve \u00e7\u0131kt\u0131 ak\u0131\u015flar\u0131n\u0131 y\u00f6netirken performans kritik \u00f6neme sahiptir. \u00d6zellikle yo\u011fun girdi alan interaktif uygulamalarda, her <code>INPUT_RECORD<\/code>'u tek tek okumak ve i\u015flemek gecikmelere yol a\u00e7abilir. Bu noktada Go'nun e\u015fzamanl\u0131l\u0131k yetenekleri (goroutines ve kanallar) devreye girer.<\/p>\n<ul>\n<li><strong>Girdi Okuma Goroutinesi<\/strong>: ConPTY'nin \"output\" pipe'\u0131ndan <code>INPUT_RECORD<\/code>'lar\u0131 okumak i\u00e7in ayr\u0131 bir goroutine ba\u015flat\u0131n. Bu goroutine, okudu\u011fu her <code>INPUT_RECORD<\/code>'u ayr\u0131\u015ft\u0131r\u0131r ve d\u00f6n\u00fc\u015ft\u00fcr\u00fclm\u00fc\u015f VT sekanslar\u0131n\u0131 bir kanala g\u00f6nderir.<\/li>\n<li><strong>Girdi \u0130\u015fleme Goroutinesi<\/strong>: Ba\u015fka bir goroutine, bu kanaldan gelen VT sekanslar\u0131n\u0131 al\u0131r ve alt s\u00fcrecin <code>stdin<\/code>'ine yazar. Bu, okuma ve yazma i\u015flemlerini ay\u0131rarak bloklama sorunlar\u0131n\u0131 azalt\u0131r ve tepkiselli\u011fi art\u0131r\u0131r.<\/li>\n<li><strong>\u00c7\u0131kt\u0131 Okuma ve Yazma Goroutineleri<\/strong>: Benzer \u015fekilde, alt s\u00fcre\u00e7ten gelen \u00e7\u0131kt\u0131lar\u0131 okumak ve <code>os.Stdout<\/code>'a yazmak i\u00e7in de ayr\u0131 goroutineler kullan\u0131n. Bu sayede, \u00e7\u0131kt\u0131 i\u015flemleri girdi i\u015flemlerini engellemez.<\/li>\n<\/ul>\n<p>Verimli buffer y\u00f6netimi, \u00f6zellikle b\u00fcy\u00fck verilerin okunup yaz\u0131ld\u0131\u011f\u0131 durumlarda hayati \u00f6nem ta\u015f\u0131r. <code>io.Reader<\/code> ve <code>io.Writer<\/code> aray\u00fczlerini kullanan Go'nun standart k\u00fct\u00fcphanesi, buffer'l\u0131 okuma\/yazma i\u00e7in <code>bufio<\/code> paketi gibi ara\u00e7lar sunar. Bu, sistem \u00e7a\u011fr\u0131s\u0131 say\u0131s\u0131n\u0131 azaltarak performans\u0131 art\u0131rabilir.<\/p>\n<h3>3. Hata Y\u00f6netimi ve Beklenmeyen Girdilerle Ba\u015fa \u00c7\u0131kma<\/h3>\n<p>Sistem programlamas\u0131nda hatalar ka\u00e7\u0131n\u0131lmazd\u0131r. Pipe'lar\u0131n beklenmedik \u015fekilde kapanmas\u0131, okuma\/yazma hatalar\u0131 veya bozuk <code>INPUT_RECORD<\/code> verileri gibi durumlar ortaya \u00e7\u0131kabilir. Sa\u011flam bir ConPTY uygulamas\u0131, bu t\u00fcr senaryolar\u0131 do\u011fru bir \u015fekilde ele almal\u0131d\u0131r.<\/p>\n<ul>\n<li><code>syscall.ReadFile<\/code> veya <code>syscall.WriteFile<\/code> gibi fonksiyonlardan d\u00f6nen hatalar\u0131 dikkatlice kontrol edin. \u00d6zellikle <code>syscall.ERROR_BROKEN_PIPE<\/code> gibi hatalar, pipe'\u0131n kapand\u0131\u011f\u0131n\u0131 ve alt s\u00fcrecin sonland\u0131\u011f\u0131n\u0131 g\u00f6sterir.<\/li>\n<li><code>INPUT_RECORD<\/code> ayr\u0131\u015ft\u0131rma mant\u0131\u011f\u0131n\u0131z\u0131 esnek tutun. E\u011fer beklenmeyen bir <code>EventType<\/code> veya bozuk bir yap\u0131 gelirse, uygulaman\u0131z\u0131n \u00e7\u00f6kmemesi, bunun yerine uygun bir \u015fekilde g\u00fcnl\u00fc\u011fe kaydetmesi ve hatay\u0131 atlamas\u0131 gerekir.<\/li>\n<li>ConPTY handle'lar\u0131 ve pipe'lar\u0131 i\u00e7in <code>defer<\/code> kullanarak d\u00fczg\u00fcn kaynak temizli\u011fi yapmak, haf\u0131za s\u0131z\u0131nt\u0131lar\u0131n\u0131 ve handle s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nler.<\/li>\n<\/ul>\n<h3>4. \u00c7e\u015fitli Terminal Em\u00fclat\u00f6rleri ve Uyumluluk<\/h3>\n<p>Windows Terminal yayg\u0131n olarak kullan\u0131lsa da, kullan\u0131c\u0131lar hala cmd.exe, PowerShell ISE veya \u00fc\u00e7\u00fcnc\u00fc taraf terminal em\u00fclat\u00f6rleri (\u00f6rne\u011fin Git Bash, Cmder) kullanabilirler. ConPTY bu em\u00fclat\u00f6rlerle de \u00e7al\u0131\u015fabilir, ancak <code>win32-input-mode<\/code>'un davran\u0131\u015f\u0131 her zaman ayn\u0131 olmayabilir.<\/p>\n<ul>\n<li>Uygulaman\u0131z\u0131 farkl\u0131 terminal ortamlar\u0131nda test edin. <code>win32-input-mode<\/code>'un ne zaman devreye girdi\u011fini ve her ortamda nas\u0131l davrand\u0131\u011f\u0131n\u0131 anlay\u0131n.<\/li>\n<li>Baz\u0131 eski terminal em\u00fclat\u00f6rleri veya hatta belirli <code>console host<\/code> yap\u0131land\u0131rmalar\u0131, modern VT sekanslar\u0131n\u0131 tam olarak desteklemeyebilir. Bu durumlarda, geri d\u00f6n\u00fc\u015f mekanizmalar\u0131 veya daha temel girdi i\u015fleme y\u00f6ntemleri d\u00fc\u015f\u00fcnebilirsiniz.<\/li>\n<li>Go uygulaman\u0131z\u0131n, terminalin yeteneklerini sorgulayarak (\u00f6rne\u011fin <code>TERM<\/code> ortam de\u011fi\u015fkenine bakarak veya belirli VT sekanslar\u0131 g\u00f6nderip cevaplar\u0131n\u0131 okuyarak) davran\u0131\u015f\u0131n\u0131 dinamik olarak ayarlamas\u0131 faydal\u0131 olabilir.<\/li>\n<\/ul>\n<p>Bu ileri d\u00fczey teknikler, Go ile ConPTY uygulamalar\u0131 geli\u015ftirirken sadece i\u015flevsellik de\u011fil, ayn\u0131 zamanda g\u00fcvenilirlik, performans ve geni\u015f uyumluluk sa\u011flaman\u0131za yard\u0131mc\u0131 olacakt\u0131r. Terminal uygulamalar\u0131n\u0131n karma\u015f\u0131k d\u00fcnyas\u0131nda, bu detaylara dikkat etmek, kullan\u0131c\u0131lar\u0131n\u0131z i\u00e7in \u00fcst\u00fcn bir deneyim yaratman\u0131n anahtar\u0131d\u0131r.<\/p>\n<h2>Sonu\u00e7: Daha \u0130yi Bir Terminal Deneyimi \u0130\u00e7in Ad\u0131mlar<\/h2>\n<p>Bu kapsaml\u0131 makale boyunca, Windows Terminal'in modern yap\u0131s\u0131n\u0131, Go ile ConPTY uygulamalar\u0131 geli\u015ftirmenin temellerini ve \u00f6zellikle <code>win32-input-mode<\/code>'un getirdi\u011fi girdi y\u00f6netimi zorluklar\u0131n\u0131 ayr\u0131nt\u0131lar\u0131yla inceledik. Geleneksel VT sekanslar\u0131ndan farkl\u0131 olarak, <code>INPUT_RECORD<\/code> yap\u0131lar\u0131 \u015feklinde gelen girdilerin nas\u0131l ayr\u0131\u015ft\u0131r\u0131laca\u011f\u0131n\u0131 ve interaktif CLI uygulamalar\u0131 i\u00e7in nas\u0131l normalle\u015ftirilece\u011fini ad\u0131m ad\u0131m \u00f6\u011frendik. Go'nun <code>syscall<\/code> paketi arac\u0131l\u0131\u011f\u0131yla Windows API'leriyle etkile\u015fim kurarak, bu karma\u015f\u0131k mekanizmalar\u0131 kendi lehimize \u00e7evirmenin yollar\u0131n\u0131 ke\u015ffettik. Metin g\u00f6r\u00fcnt\u00fcleyici vaka analizi ile teorik bilgiyi pratik bir senaryoya d\u00f6n\u00fc\u015ft\u00fcrd\u00fck ve ileri d\u00fczey optimizasyon teknikleriyle uygulamalar\u0131m\u0131z\u0131 daha sa\u011flam ve performansl\u0131 hale getirmenin yollar\u0131n\u0131 payla\u015ft\u0131k.<\/p>\n<p><code>win32-input-mode<\/code>, ba\u015flang\u0131\u00e7ta kafa kar\u0131\u015ft\u0131r\u0131c\u0131 gibi g\u00f6r\u00fcnse de, asl\u0131nda Windows'un terminal deneyimini zenginle\u015ftirme \u00e7abas\u0131n\u0131n bir sonucudur. Go geli\u015ftiricileri olarak bizlere d\u00fc\u015fen g\u00f6rev, bu modun dinamiklerini anlayarak, uygulamalar\u0131m\u0131z\u0131 her platformda sorunsuz \u00e7al\u0131\u015facak \u015fekilde tasarlamakt\u0131r. Go'nun e\u015fzamanl\u0131l\u0131k yetenekleri ve d\u00fc\u015f\u00fck seviyeli sistem \u00e7a\u011fr\u0131lar\u0131na eri\u015fim imkan\u0131, bu t\u00fcr zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in bize g\u00fc\u00e7l\u00fc bir ara\u00e7 seti sunmaktad\u0131r. Do\u011fru ayr\u0131\u015ft\u0131rma, buffer y\u00f6netimi ve hata kontrol\u00fc ile, kullan\u0131c\u0131lar\u0131n Windows Terminal'de de Linux veya macOS'teki gibi ak\u0131c\u0131 ve zengin interaktif CLI deneyimleri ya\u015famas\u0131n\u0131 sa\u011flayabiliriz. Bu sayede, terminal uygulamalar\u0131 ekosisteminde Go'nun potansiyelini tam olarak kullanm\u0131\u015f oluruz.<\/p>\n<p>Gelecekte, ConPTY ve terminal ekosisteminde daha fazla geli\u015fme ya\u015fanmas\u0131 beklenmektedir. Microsoft'un bu alandaki s\u00fcrekli yat\u0131r\u0131mlar\u0131, geli\u015ftiriciler i\u00e7in daha standartla\u015ft\u0131r\u0131lm\u0131\u015f ve daha kolay kullan\u0131labilir API'lere yol a\u00e7abilir. Bu geli\u015fmeler, <code>win32-input-mode<\/code> gibi \u00f6zel durumlarla ba\u015fa \u00e7\u0131kma ihtiyac\u0131n\u0131 azaltabilir veya daha basit soyutlamalar sunabilir. Ancak \u015fimdilik, Go ile bu derinlemesine anlay\u0131\u015fa sahip olmak, terminal uygulamalar\u0131m\u0131z\u0131n gelece\u011fe haz\u0131r olmas\u0131n\u0131 sa\u011flaman\u0131n en iyi yoludur. Geli\u015ftiricilerin bu makalede sunulan bilgileri kullanarak, hem kendi projelerinde hem de a\u00e7\u0131k kaynak toplulu\u011funa katk\u0131da bulunarak daha iyi terminal ara\u00e7lar\u0131 in\u015fa etmelerini umuyoruz. Unutmay\u0131n, terminal uygulamalar\u0131n\u0131n kalitesi, sadece \u00e7\u0131kt\u0131lar\u0131 de\u011fil, ayn\u0131 zamanda girdileri ne kadar iyi i\u015fleyebildi\u011fiyle de \u00f6l\u00e7\u00fcl\u00fcr.<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<h3>1. win32-input-mode her zaman aktif midir?<\/h3>\n<p>Hay\u0131r, <code>win32-input-mode<\/code> her zaman aktif de\u011fildir. Genellikle Windows Terminal gibi modern bir terminal em\u00fclat\u00f6r\u00fc taraf\u0131ndan bar\u0131nd\u0131r\u0131lan ConPTY oturumlar\u0131nda devreye girer. Di\u011fer konsol pencereleri (\u00f6rne\u011fin, do\u011frudan <code>cmd.exe<\/code> veya PowerShell) veya eski terminal em\u00fclat\u00f6rleri, varsay\u0131lan olarak geleneksel VT sekanslar\u0131n\u0131 veya Windows'un kendi eski konsol girdi API'lerini kullanabilir.<\/p>\n<h3>2. ConPTY'nin Linux\/macOS'teki PTY'den fark\u0131 nedir?<\/h3>\n<p>ConPTY (Console Pseudo-terminal) ve PTY (Pseudo-terminal), benzer ama\u00e7lara hizmet etse de, temel farklar\u0131 vard\u0131r. PTY, Unix benzeri sistemlerde bir terminal aray\u00fcz\u00fcn\u00fc taklit eder ve alt s\u00fcre\u00e7lerin do\u011frudan terminal ayg\u0131tlar\u0131yla etkile\u015fime girmesini sa\u011flar. ConPTY ise Windows'a \u00f6zg\u00fcd\u00fcr ve alt s\u00fcrecin Windows Konsol API'lerini kullanmaya devam etmesini sa\u011flar. Yani, PTY \u00e7ekirdek d\u00fczeyinde bir ayg\u0131tken, ConPTY bir API katman\u0131d\u0131r. Bu fark, girdi\/\u00e7\u0131kt\u0131 y\u00f6netiminde ve \u00f6zellikle <code>win32-input-mode<\/code> gibi Windows'a \u00f6zg\u00fc davran\u0131\u015flarda kendini g\u00f6sterir.<\/p>\n<h3>3. Sadece Go mu bu sorunlar\u0131 \u00e7\u00f6zebilir? Ba\u015fka dillerde durum nedir?<\/h3>\n<p>Hay\u0131r, sadece Go bu sorunlar\u0131 \u00e7\u00f6zemez. ConPTY ve <code>win32-input-mode<\/code>, Windows'un genel bir API'si ve mekanizmas\u0131d\u0131r. C#, Python, Rust gibi Windows API'leriyle etkile\u015fime ge\u00e7ebilen di\u011fer programlama dilleri de benzer y\u00f6ntemlerle (kendi <code>syscall<\/code> veya FFI (Foreign Function Interface) mekanizmalar\u0131n\u0131 kullanarak) bu sorunlar\u0131 \u00e7\u00f6zebilir. Go'nun burada \u00f6ne \u00e7\u0131kmas\u0131, sistem programlama yetenekleri, e\u015fzamanl\u0131l\u0131k deste\u011fi ve nispeten basit s\u00f6zdizimi ile bu t\u00fcr d\u00fc\u015f\u00fck seviyeli i\u015fler i\u00e7in olduk\u00e7a uygun olmas\u0131d\u0131r.<\/p>\n<h3>4. Fare kayd\u0131rma olaylar\u0131n\u0131 nas\u0131l yakalar\u0131m ve VT sekans\u0131na \u00e7eviririm?<\/h3>\n<p>Fare kayd\u0131rma olaylar\u0131, <code>MOUSE_EVENT_RECORD<\/code> yap\u0131s\u0131nda <code>dwEventFlags<\/code> alan\u0131n\u0131n <code>MOUSE_WHEELED<\/code> (0x0004) olarak ayarlanmas\u0131yla tespit edilir. Tekerle\u011fin ne kadar kayd\u0131r\u0131ld\u0131\u011f\u0131 bilgisi ise <code>dwButtonState<\/code> alan\u0131n\u0131n y\u00fcksek baytlar\u0131nda (<code>>> 16<\/code> ile elde edilir) bulunur. Bu de\u011feri pozitif veya negatif olarak yorumlayarak yukar\u0131 veya a\u015fa\u011f\u0131 kayd\u0131rmay\u0131 belirleyebilirsiniz. Ard\u0131ndan, bu bilgiyi SGR format\u0131nda fare raporlamas\u0131na uygun \u00f6zel VT sekanslar\u0131na (\u00f6rne\u011fin, yukar\u0131 kayd\u0131rma i\u00e7in <code>\\x1b[<64;X;YM<\/code>, a\u015fa\u011f\u0131 kayd\u0131rma i\u00e7in <code>\\x1b[<65;X;YM<\/code>) d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz.<\/p>\n<h3>5. ConPTY kullanmak performans sorunlar\u0131na yol a\u00e7ar m\u0131?<\/h3>\n<p>Her ek soyutlama katman\u0131 gibi, ConPTY de minimal bir performans y\u00fck\u00fc getirebilir. <code>INPUT_RECORD<\/code>'lar\u0131 okuma, ayr\u0131\u015ft\u0131rma ve VT sekanslar\u0131na d\u00f6n\u00fc\u015ft\u00fcrme i\u015flemleri de ek CPU d\u00f6ng\u00fcleri gerektirir. Ancak, modern donan\u0131mlarda ve Go'nun verimli e\u015fzamanl\u0131l\u0131k modelleriyle (goroutines), \u00e7o\u011fu interaktif CLI uygulamas\u0131 i\u00e7in bu performans maliyeti genellikle g\u00f6z ard\u0131 edilebilir d\u00fczeydedir. Y\u00fcksek frekansl\u0131, saniyede binlerce girdi alan \u00e7ok \u00f6zel durumlarda optimizasyonlara (\u00f6rne\u011fin, daha b\u00fcy\u00fck buffer'lar, do\u011frudan bellek eri\u015fimi) ihtiya\u00e7 duyulabilir, ancak genel kullan\u0131m i\u00e7in performans\u0131 yeterince iyidir.<\/p>\n","protected":false},"excerpt":{"rendered":"Go ConPTY Uygulamalar\u0131nda Windows Terminal Girdilerini Y\u00f6netme Modern terminal uygulamalar\u0131 geli\u015ftirirken, kullan\u0131c\u0131 girdilerini do\u011fru bir \u015fekilde yakalamak ve&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-36385","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Windows Terminal, ConPTY ve win32-input-mode Nedir?<\/title>\n<meta name=\"description\" content=\"Go ConPTY Uygulamalar\u0131nda Windows Terminal Girdilerini Y\u00f6netme\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Windows Terminal, ConPTY ve win32-input-mode Nedir?\" \/>\n<meta property=\"og:description\" content=\"Go ConPTY Uygulamalar\u0131nda Windows Terminal Girdilerini Y\u00f6netme\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-15T08:31:28+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"23 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Windows Terminal, ConPTY ve win32-input-mode Nedir?\",\"datePublished\":\"2025-12-15T08:31:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/\"},\"wordCount\":5196,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/\",\"name\":\"Windows Terminal, ConPTY ve win32-input-mode Nedir?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-15T08:31:28+00:00\",\"description\":\"Go ConPTY Uygulamalar\u0131nda Windows Terminal Girdilerini Y\u00f6netme\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Windows Terminal, ConPTY ve win32-input-mode Nedir?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Windows Terminal, ConPTY ve win32-input-mode Nedir?","description":"Go ConPTY Uygulamalar\u0131nda Windows Terminal Girdilerini Y\u00f6netme","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/","og_locale":"tr_TR","og_type":"article","og_title":"Windows Terminal, ConPTY ve win32-input-mode Nedir?","og_description":"Go ConPTY Uygulamalar\u0131nda Windows Terminal Girdilerini Y\u00f6netme","og_url":"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-15T08:31:28+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"23 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Windows Terminal, ConPTY ve win32-input-mode Nedir?","datePublished":"2025-12-15T08:31:28+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/"},"wordCount":5196,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/","url":"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/","name":"Windows Terminal, ConPTY ve win32-input-mode Nedir?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-15T08:31:28+00:00","description":"Go ConPTY Uygulamalar\u0131nda Windows Terminal Girdilerini Y\u00f6netme","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/windows-terminal-conpty-ve-win32-input-mode-nedir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Windows Terminal, ConPTY ve win32-input-mode Nedir?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36385","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36385"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36385\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36385"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36385"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36385"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}