Форум » [x]Harbour » Пара простых вопросов ;) » Ответить

Пара простых вопросов ;)

Dima: 1. Как узнать что путь к папке из которой запускается программа имеет символы кирилицы ? На ум приходит такой способ [pre2] proc main() local a REQUEST HB_LANG_RU866 HB_LANGSELECT("RU866") REQUEST HB_CODEPAGE_RU866 hb_cdpSelect( "RU866" ) a:=curdir() ? a if hb_oemtoansi(a)#a ? "Есть кирилица" endif wait RETURN NIL [/pre2] Есть еще метода ? 2. Как узнать что путь к папке из которой запускается программа имеет длинные имена ? На вскидку приходит вариант разбить на токены с разделителем "\" и затем чекать длины всех токенов. Есть еще метода ?

Ответов - 85, стр: 1 2 3 4 5 All

Dima: SergKis А можете немного допилить INKEYGUI что бы она вернула ASCII код с учетом раскладки ? Вероятно нужна эта функция https://msdn.microsoft.com/en-us/library/windows/desktop/ms646318%28v=vs.85%29.aspx

Dima: Почти победил преобразование VK кодов , но с кирилицей фигня полная. Что не так сделал ? Собирал так c:\hb32\bin\hbmk2 t -gtwvt -gui [pre2] #include "hbgtinfo.ch" proc main local a REQUEST HB_GT_WVT_DEFAULT REQUEST HB_LANG_RU866 HB_LANGSELECT("RU866") REQUEST HB_CODEPAGE_RU866 hb_cdpSelect( "RU866" ) hb_gtInfo(HB_GTI_FONTNAME, 'Lucida Console') ? "TEST" do while (a:=inkeygui(0))#27 ? a ? chr(toasciiex(a)) enddo return ************************* #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" #include "hbapiitm.h" HB_FUNC( TOASCIIEX ) { HKL hkl = GetKeyboardLayout( 0 ); BYTE KeyState[256]; WORD lpChar; GetKeyboardState( KeyState ); ToAsciiEx( hb_parnl(1), 0, KeyState, &lpChar, 0, hkl ); hb_retnl( LOBYTE( lpChar )); } #pragma ENDDUMP #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> HB_FUNC( INKEYGUI ) { MSG Msg; BOOL lNoLoop=FALSE; UINT dwTimer, nRet=0, uTimeout=10; if( HB_ISNUM(1) ) uTimeout = hb_parni(1); if( uTimeout==0 ) uTimeout = 0x0FFFFFFF; dwTimer = SetTimer( NULL, 0, uTimeout, NULL); while( GetMessage(&Msg, NULL, 0, 0) ) { switch( Msg.message ) { case WM_KEYDOWN : case WM_SYSKEYDOWN : { nRet = Msg.wParam; lNoLoop = TRUE; break; } case WM_TIMER : { lNoLoop = Msg.wParam == dwTimer; break; } } if( lNoLoop ) { KillTimer( NULL, dwTimer ); hb_retni( nRet ); return ; } else { TranslateMessage( &Msg ); // Translates virtual key codes DispatchMessage( &Msg ); // Dispatches message to window } } } #pragma ENDDUMP [/pre2]

Dima: Упс , понял , надо так ? hb_ansitooem(chr(toasciiex(a)))


SergKis: Dima пишет:Упс , понял , надо так ? и что ? получилось ?

Dima: SergKis пишет: и что ? получилось ? Практически да , допиливаю пока.

Dima: SergKis А вот такой фокус похоже не работает. Keyboard chr(112) ? inkeygui() // ни какой реакции на посыл кода через Keyboard

SergKis: Dima в wvt соорудили перекодировку (см.функции выше ..event..1) VK клавиш ни какой реакции на посыл кода через Keyboard возможно надо использовать сообщение WM_COPYDATA, типа Keyboard посылает а в inkeygui вставить обработку

Dima: PSP пишет: Использовать в цикле hb_ReleaseCPU() не подойдет? Таки да Если в основном потоке клаву опрашивать так , nkey:=Inkey(0.01) , проц не грузит. Если так же ее опрашивать в IDLE функции живущей в HB_IdleAdd() , то да грузит проц. Долго игрался и доигрался В IDLE опрашивать надо так [pre2] nKey:=Inkey() hb_releasecpu() * ни чего грузит и все пучком. [/pre2]

PSP: Ну да, именно так )))

Dima: PSP пишет: Ну да, именно так ))) Нет что б сразу сказать подробнее ))) 2 дня убил да еще мучал InkeyGui (с ним тоже вариант , но функция специфическая)

PSP: Я ж не знал ) А ты написал, что уже пробовал... ))

Dima: Можно ли в вызываемой функции узнать , она была вызвана из основного потока или дочернего ? ЗЫ MT приложение. Проехали , нашел. hb_threadSelf()

alkresin: pThID := hb_threadSelf() Возвращает указатель потока, из которого вызывается эта функция.

Dima: Почему есть функции HB_LEFTEQ() и HB_LEFTEQI() (удобнее чем LEFT()) а подобных аналогов c RIGHT нет ?

Петр: В ChangeLog логика HB_LEFT* ясно описана + added new function to replace "=" operator without the SET EXACT ambiguity in its most common pattern of usage: hb_LeftEq( <cString1>, <cString2> ) -> <lResult> it's equivalent to this expression, but faster and shorter: ( Left( <cString1>, Len( <cString2> ) ) == <cString2> ) 2014-01-22 03:09 UTC+0100 Viktor Szakáts + added hb_LeftEqI(). Same as hb_LeftEq() but case-insensitive. hb_LeftEqI( <cString1>, <cString2> ) -> <lResult> 2014-02-04 13:38 UTC+0100 Viktor Szakáts Ну а RIGHT, наверное, так часто не пользуются

Dima: Петр пишет: Ну а RIGHT, наверное, так часто не пользуются Да наверное так и есть. PRG аналоги могли бы быть примерно такими [pre2] Func Hb_rightEQI(Cstr1 , Cstr2) return Iif (Hb_isstring(Cstr1) .and. Hb_isstring(Cstr1) ; .and. Right(upper(Cstr1),len(Cstr2))==Upper(Cstr2),.T.,.F.) [/pre2] Примерно так же Hb_rightEQ , но без Upper или можно было сделать единую функцию Hb_right() с 3-м параметром.

Dima: Посетила меня идея , организовать в своей сетевой задаче просмотр экрана другого юзера , для начала только скрин , в перспективе "видео" (показ тех же скринов с задержкой). Реализация думаю не очень сложная и решу. Есть пара вопросов ( Терминал GTWVT (WVG) ) 1. Как средствами Harbour снять скрин окна с нужным заголовком и сохранить в файл формата JPG скажем. 2. -\\-\\-\\\-\\- cнять скрин всего рабочего стола со всеми окнами и -\\-\\-\\\-\\-

Andrey: Dima пишет: экрана другого юзера , для начала только скрин Давай уж сразу на МиниГуи ! Тем более там уже реализовано снятие всего экрана ! Не помню какой пример, но точно сам видел !

petr707: есть такой пример..\MiniGUI\SAMPLES\Applications\ScreenshotMaker портируется и в harbour, из примера нужно взять JPG.DLL = = = DYNAMIC SaveToJpgEx ... Function SnapJpg(cSaveFile,cfile_dll) Local nW := HB_GTINFO( HB_GTI_DESKTOPWIDTH ) Local nH := HB_GTINFO( HB_GTI_DESKTOPHEIGHT ) Local nHandle := GETDESKTOPWINDOW() Local ret := .f. cfile_dll := IIF(cfile_dll=NIL,"jpg.dll",cfile_dll) if file(cfile_dll) cSaveFile := IIF( cSaveFile=NIL, "test.jpg" ,cSaveFile) Calldll32( "SaveToJpgEx",cfile_dll, nHandle, cSaveFile, nW, nH ) ret:=file(cSaveFile) else tolog("SnapJpG: Нет файла DLL {"+cfile_dll+"} ") ret:=.f. endif Return ret

Dima: petr707 Спасибо за идею , работает. [pre2] #include "hbgtinfo.ch" #include "hbdyn.ch" Proc main REQUEST HB_GT_WVT REQUEST HB_GT_WVG_DEFAULT ? " " ? snapJpg(CurDrive()+":\"+CurDir()+"\test.jpg",0) wait return ********************* Func SnapJpg(cfile,nmode) Local nW Local nH Local nHandle hb_default(@nmode,0) hb_default(@cfile,"test.jpg") if nmode==0 nHandle := wapi_GETDESKTOPWINDOW() nW := HB_GTINFO( HB_GTI_DESKTOPWIDTH ) nH := HB_GTINFO( HB_GTI_DESKTOPHEIGHT ) else nHandle := GETFOREGROUNDWINDOW() nw := HB_GTINFO( HB_GTI_SCREENWIDTH ) nh := HB_GTINFO( HB_GTI_SCREENHEIGHT ) endif hb_DynCall( { "SaveToJpgEx", "jpg.dll",HB_DYN_CALLCONV_STDCALL },nHandle,cfile,nw,nh ) return HB_fileexists(cfile) ***************** #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> HB_FUNC (GETFOREGROUNDWINDOW) { HWND hWnd = GetForegroundWindow(); hb_retnl ((LONG) hWnd); } #pragma ENDDUMP [/pre2]



полная версия страницы