记录一些学习小事

Work hard

统计

留言簿

阅读排行榜

评论排行榜

2011年9月11日 #

大家天天写程序累了,小弟贴个小文章过来,给大家点心灵上的感触

从搬进这家民房的第一天,我就开始怀疑我隔壁的那个储藏室根本没住人。一天到晚黑黢黢的,没半点声响。 
我终于还是忍受不了房间里那个破沙发了,便又一次跟房东要求,能不能让我把一些杂物放进隔壁的储藏室。房东斜着眼,哼了一下:跟你说过多少次了?那储藏室租给一对民工夫妇了,里面住着人呢! 
我算见识了广东人的抠门,就打算再也不去碰这一鼻子灰了。 
那天,我出来倒垃圾,经过储藏室的门,听到里面窸窸嗦嗦的,气就不打一处来,我知道肯定是老鼠又在里面大**了。我狠狠地一脚踹在门上,还不解气,就又猛踹一脚。 
门吱嘎的开了,我吓了一跳。我以为我把门踹坏了;正忐忑不安的时候,一个女人的脑袋伸了出来,确切的说应该是个女孩或者少妇,从她那蓬松的马尾辫和还有些稚气的脸上我实在无法判断她的年龄。 
她轻轻的问道:您找谁? 
我愣了,呆在那里,不知道说什么好。 
这时候一个有些猥琐的男孩子也把脑袋凑着伸了出来,迟疑了一下说:你是隔壁的吧?! 
我一下子醒悟过来,说:是啊,是啊。 
男孩子笑嘻嘻的得意的说:我上次下班回来见过你。 
周围的空气戛然的停在那里,有些尴尬。我赶忙说着:不好意思,不好意思,打扰你们了。便迅速的溜回自己的房门。我听到了他们轻轻关房门的声音,还听到了他们窃窃私语的声音,好像在说:是不是我们平时动静太大,吵到邻居了?那以后我们要多注意了!之类的话。 
我喝了口水,平静下来,我才确信,那个一天到晚黑洞洞的储藏室里真的住着俩人,这俩人也许就是房东说的那对民工夫妇。 
我突然冷笑了一下,还夫妇呢,一看也就20来岁的样子,私奔出来的?还是新婚小夫妻?不自觉的笑了笑,自我解嘲的想:民工么, 农村出来的,结婚普遍早。那看来以后得称呼,那男人,那女人了。这样想着,还抑制不住的笑出了声。 
第一次跟这对小夫妻接触是因为我忘记了带钥匙,进不了门,便找他们借工具,想把门撬开。 
那是我第一次真正的去敲那个门,也是第一次去光顾那个阴暗的储藏室。 
门开了,他们夫妻看到我似乎很惊喜,赶忙的让我进屋。我说明来意,他们夫妻就转身找家伙去了。门开着,里面黑乎乎的,我忍不住往里迈了一步。不知道脚被什么绊了一下,我以为是有老鼠,吓得“哎哟”大叫。他们中的一个,立马打开了灯。天花板上的那盏小灯散发着昏黄的光,我敢肯定那灯泡不会超过10瓦。我很怀疑他们能从哪里买到这样的灯泡,在这样一个南方大都市我实在想象不出来哪里会有卖这样的灯泡的。我猜想也许那是他们从老家带来的也说不定。 
我打量着这个我曾经很想把杂物放进来的储藏室。我以最奢侈的估算,房间不会超过10个平方。四周没有任何一个窗户,门是唯一可以通风和出入的地方。房间里散发着一种潮湿的霉味,钻进嗓子眼,让人感觉恶心。我忍不住一个箭步退了出来。 
可是我却清楚的看到,房间里除了一张单人木板床和零落在地上的锅碗瓢盘,真的没有任何插脚的地方,我真佩服那对小夫妻是怎么呆在里面生活的。 
最后,夫妻俩找到他们做饭的刀,也是唯一一个有可能打开我房门的工具,费了九牛二虎之力帮我弄开了门。 
门开了,我并没有任何要他们进来的意思。他们站在门口,把着门框。踮着脚尖,一副腼腆的样子,打量着我这个两室一厅的房子。女人终于说了一句话:怎么从来没看见过您先生啊?我怔着脸说:我还没结婚。女的脸红了,似乎说错了话,低着头,不敢搭腔。男人不好意思地说;那您一个人住这么大的房子啊。我没回答。 
两个人,半响没说话。不知道是谁先看到了我放在客厅的电脑,便忍不住说:您有电脑呢! 
我心里一个咯噔,民工也懂电脑?我说:是啊,你会上网么? 
男的挠了挠头皮说:我们读大学的时候,有电脑课,上过机。 
我嗖的浑身一阵发凉,大学?他们是大学生?可是怎么看怎么不像阿! 
我心里多少有点被欺骗的感觉,就故意问:那你们现在做什么工作的?你们什么学校毕业的?读的什么专业啊? 
他们抿了抿嘴,有点不好意思,我以为这下可揭穿你们了,真虚伪! 
突然男的开口了:我们读的学校不好,也就是个三流大学,我跟我老婆是一个大学的又是同乡,她读文科,我读理科。现在我做业务员,她在餐馆当服务员。 
我撇了撇嘴,“哦”了一声。 
“我是**大学研究生毕业”在我说完这句话的时候,我才发现,门口的两个人不知道什么时候已经走了。 
我有点失落,猜测着他们有没有听到我提到**大学这个重点大学的名字 
众所周知,这几年扩招,大学生可谓是遍地爬。大学容易读了,可是就业却难多了。三流大学的毕业生,真的是连民工都不如,要体力没体力,要脑力又够不上格。而且三流大学学费并不见得低,甚至要比好的大学要高很多,我就知道很多三流大学学费高的惊人。 
看这对小夫妻,估计是农村出来的,当初他们也许并不知道,花光家里的积蓄,得到的这一纸文凭,原来在这个社会里也许什么都不是。背负着一身债务,出来打工才知道,原来三流大学的大学生只能跟小学没毕业的靠体力吃饭的民工是一个层次的,都是命比纸薄,人比命贱的。 
第二天,虽然我内心深处还在揣测着,他们拿刀给我撬门技术这么好会不会哪天趁我不在也会这样熟练的顺手?可是总还是觉得别人帮了忙过意不去,就买了几斤南方的水果给他们拎了过去。 
他们似乎受宠若惊,说什么也不要。我就告诉他们这是广州这边的规矩,找人帮了忙,一定要表示的,不收就是不给我面子。他们才诚惶诚恐的收下了。 
没过一会,他们又来敲我的门。我以为是他们是把水果又送回来的,结果开门后的第一句话就说:请问,这水果最多能放多久?我诧异的望着他们,心里有点气,心想:难道他们以为我给他们买的水果过期了?我正要发作,他们便补充一句:能放到过年回家么?我愣了,他们说:过年没啥带回去的,这水果一定不便宜吧?我们想过年回去的时候带回去当年货。我有点哭笑不得说:广州天热,不能放那么久的,个把星期就得坏了。 
他们有点无奈,说了句谢谢,就走了。 
可是我明明听到:男的对女的说:要不我们想办法留到8月15,过节的时候打打馋吧。 
一个月后,农历的8月15,单位每人发了一盒高级月饼,拿回来后,我拆开尝了一个,感觉很难吃,就想丢掉。 
经过那个储藏室的门,我改变了主意,想着丢了也怪可惜的,他们那么可怜,倒不如给他们过节的好。 
看着门虚掩着,我没敲,就径直推开了,那盏昏黄的灯亮着,两个人蹲在地上,男的正在小心翼翼的切一个小小的月饼,正准备把一块稍大点的给老婆吃,看到我站在门口,不知所措的说不出话来。女的正低头啃着明显已经有点坏了的水果,吃的津津有味,我看到她没有削皮,番石榴和火龙果都是带着皮吃的。 
男人呆了五秒,赶紧要把那块稍微大点的月饼让给我吃,我说我不吃月饼的,然后说明了来意。把那盒月饼放在门口就准备离去。女人叫住了我:大姐,我都不知道说什么好了,你看,我们吃的水果也是您给的,您又给我们送月饼来,我都不知道该怎么报答您了,本来今天老公公司给他发了一个月饼,我们商量着给您送去的,可是一个拿不出手,就没好意思,我们也没什么稀罕物,你有啥事要帮忙的,一定吱应一声啊! 
我这才知道,那一个月饼是她老公发的,我也这才知道,她啃的水果是一个月前我送给他们的。我本来想说:吃火龙果要扒皮。可是我忍了忍,没有说出来。 
周末,隔壁的女人来敲门,问我有什么事是他们帮得上忙的,我笑着说没有。她眼尖,看到我沙发上放着一大堆脏衣服,非要帮我洗,我说有洗衣机,一会丢进去就是了,不费事的。她尴尬的站在那里,像是很对不起的样子,不知道该做什么好。 
我第一次,很热情的邀请她进门,坐一会。她脱了鞋,光着脚丫子,进了门。战战兢兢的,似乎怕弄脏了我的地板,不敢使劲踩下去。她哪里知道其实我已经一个多星期没有擦过地板了。 
她告诉我,今天她休班,本来想帮我做点事的,可是没想到没做成。她似乎很羞愧,一直细声细气的答着我的话。她在我这里呆了半个小时,告诉了我他们的境遇,说那些话的时候她一直很温柔,像在说一个故事,丝毫没让我感觉到她的埋怨和委屈。 
我给她倒的那杯矿泉水,她一直攥在手里,临走的时候,她望了望我,我点头示意,她带走了那个一次性的纸杯子和那杯矿泉水。我猜,她是想留给她的老公喝。 
从今天我才知道,他们是这样的: 
两个农村出来的孩子,父母都是守着一亩三分地的地道农民,每年家庭收入从来不会超过2000的贫困家庭,又都考上了同一所三流大学,学费每年的需要是父母不吃不喝的5 年的家庭收入。读不起书,不想去,父母不肯,说这是唯一一次改变农村孩子命运的机会,跪下来求你去读。来读了,没钱交学费,好歹有个助学贷款,好不容易凭着优异的成绩申请到了,可是毕业的时候却因为没有还清贷款不发毕业证。四年的生活费是靠着奖学金艰难的撑下来的。到头来,辛苦的付出却换不到那一纸毕业证。于是两人只能出来打工赚钱,攒够了钱好回去赎回毕业证。 
他们租着这个城市最廉价的房子,吃着这个城市最廉价的饭菜,过着这个城市最贫困的生活,可是一年到头下来却还攒不到1万块钱。这样下去,要还完两人的贷款还要8年。 
我不知道8年对一个人的青春意味着什么,也不知道8年后是不是还能有机会有权利买回他们的毕业证。可是我知道8年的这样的生活,不是随便哪一个人能撑得住的! 
那天,我回来的时候,有点晚,楼道里的灯已经都开始亮着了,经过隔壁门口的时候,看到他们门开着,屋里照样还是黑黢黢的,男的蹲在门口大口大口的扒着面条,吃的很香。我问了一句:灯坏了?他先是迟疑了一下,然后憨憨的笑了:没呢,省电,反正楼道里的灯亮着,开着门,屋里也挺亮堂的。我笑了。我这才知道,怪不得他们屋里天天都不开灯。 
那晚他们的门一直敞开着到很晚。我在客厅里能隐隐约约的听到他们的谈话。 
他们先是谈了会,这个月又多花了多少钱,什么肥皂用的太快了,水太浪费了,上次过生日不该买那2斤肉的,以后洗菜的水可以洗脸,洗脸的水可以洗澡洗脚,洗脚的水可以洗袜子,洗袜子的水可以冲厕所等等之类的话。 
他们一边自责着自己花钱太多,一边却又忍不住憧憬着美好的未来。 
他们想象着,不久的将来,也许还完了钱,就可以要个孩子,也许将来还能攒前买房子呢。 
听着他们兴奋的呢喃声,我久久没有睡意。 
半夜,我听到男的喊肚子疼,好象疼的很厉害的样子,“哎呀哎呀”的叫着。女的 很着急,问怎么了? 男的说好象今晚吃多了,撑着了。女的就招呼他赶紧起来上厕所。 
男的迟疑了很久,似乎不想去,半响,我听到男的说话了:我不想去上厕所,我们攒的冲厕所的水还不够,那样这个月的水又要超支了。再说了,上完厕所,拉空了肚子,晚上容易饿! 
听到这里,我脑袋轰的一下,空白了, 我的心被揪的生疼生疼,那句话成了我整夜的梦魇:拉空了肚子,我怕饿! 
听到那句话,我的心震撼了。我想到了我的爷爷。 
爷爷生活在苦命的旧社会,在那个吃不饱,穿不暖的社会里,一年到头,小孩子拼命的盼着过年,因为过年能吃顿饱饭! 
所以,每个孩子在过年那天,吃的撑的小肚子圆溜溜的,肚子再怎么涨,都不舍得去厕所。因为,去了厕所,拉空了肚子,会容易感觉到饿,可是过完了年,是没有机会再能吃顿饱饭的!所以每个孩子都憋着,忍着,因为那个年代,穷,人们怕饿, 孩子更怕饿! 
可是在21世纪,在这么发达的年代,你竟然能从一个大学毕业生的嘴巴里听到这样的话,你会有怎样的感觉?感动?悲恸?还是心酸?还是无可奈何的哀叹? 
或许都是,或许都不是! 
我无暇顾及一个弱者的心态,因为社会如此,我也无能为力。我唯一能表示的除了同情或许还是只有同情。 
我也曾经鄙视过,甚至曾经在心底侮辱过: 活该,谁让你没本事考个名牌大学呢!没钱读个屁书,自作自受! 
可是我也不得不承认,一个山里的孩子,是不能仅仅凭着聪明才智就能高攀的起名牌大学的门槛的;那需要能力,实力。实力有时候除了良好的教育,优秀的老师,还有很多很多,比如金钱堆砌的补习班,比如只有城里孩子才能享受的到的全方位的教育,又比如有有权有势的父母。 
他们没有,他们是农村的孩子,他们没资格和权利有,没人给他们买各种辅导资料,也没有全国的优秀教师给他们手把手的教,他们没见过钢琴,没见过电脑,他们甚至除了村支书,不认识任何一个可以称得上干部的领导。 
他们一天到晚只会看发的那唯一的课本,只会拼命的学,只知道只有考上大学才能改变自己的命运。 
听着他们蹩脚的英语,不太流利的普通话,有些邋遢的装扮,破旧过时的衣着,我们都会忍不住笑。 
我们喜欢在背后对他们评头论足,喜欢抿着嘴吧装作淑女般的嘲笑他们的无知,甚至喜欢在要去吃麦当劳的时候故意问他们去不去。习惯了看他们的尴尬,习惯了看他们的无助,也习惯了他们失去的比得到多。 
当我们有了太多的这样的习惯,于是我们便开始不在乎,他们是不是饿,是不是在我们浪费粮食的时候,他们在心底里还默念着:不敢去厕所,怕拉空了肚子,饿!的事实。 
“人怎能跟人相比呢?没有可比性!农村的怎么能跟城市的孩子比呢?没比的必要!”这是以前我的一个朋友经常跟我说的一句话,那时候听了觉得好笑,现在想起来,觉得有点无可奈何的心酸。 
人难道真分三六九等么?谁分的?你么?? 
广州的治安是越来越差了,住这种私房,真的是冒着生命危险的。可是眼下我又找不到合适的房子搬,只能暂且战斗在最前线了。 
整栋楼有十几个房东,他们是天天围着麻将桌懒得轮流值班的,反正偷的也不是他们家的东西。最后在我们几个房客的据理力争下,好歹请了一个保安。 
我下班回来,看到楼下吵吵嚷嚷的,原来是保安抓住了个嫌疑犯。我好奇的瞥了一眼,这人不是别人,就是住在我隔壁的那个看上去有些猥琐的男人。他低着头,拼命的解释:自己不是小偷,自己是住在这里的。 
可是没有人相信他,因为当保安问他住几楼,哪个房间时,他只说了6楼,却说不出房门号。因为储藏室是没门牌号码的! 
他像个吓坏了的孩子,眼睛惊恐的扫视着周围的每个人,听着叽里呱啦的客家话,他无力的解释像一个人最后的死命挣扎。 
我本能的走过去,他看到了我,眼睛里充满了希望,含着泪珠的眸子闪过某种感激。我抬了抬我那总是直视远方的眼睛,发现周围的人都盯着我。 
我迟疑了,立刻停住了自己那8公分的高跟鞋。我轻轻理了理自己的粉色洋装,脸上滑过让人不易察觉的一丝惊慌和害怕。我想扭头冲向楼梯,当作什么都没发生过。可是我怎么也抬不动我的双腿,我僵持在哪里半秒钟。 
我尽量的压低嗓门,很礼貌矜持的说:你怎么没带大门的钥匙?是不是又丢了,真让人烦! 
保安放开了他,我微笑着说:他是我的远房亲戚。不好意思,给你添麻烦了。 
我扭头,踩着我那尖尖的高跟鞋上楼了,楼道里留下一串“嗒嗒”的响声。 
他老婆回来的时候,一直隔着门,站在我门口不停的说着:谢谢。我没吱声。过了不久,似乎她已经走了的时候,我打开门,看到他们却还站在门口,捧着一大把花生和红枣。 
我盯着他们,没开门,他们也没敢说这是给我。只是一个劲的解释:下午那会,他老公是想在楼下捡几个矿泉水瓶子呢;要早知道不让捡,他说啥也不去了。 
我本想打断她的讲话,告诉他们:不是不让捡,是你们长的不像住在这栋楼里的人。可是我还是忍住了,继续听他们说。 
他们始终低着头,轻声慢语的,说:他们也知道这里的规矩,人家帮了忙呢,一定要感谢的,可是他们没什么能拿的出手的东西,这是他们老乡回家给他们捎来的家里的特产,都是自家种的,没用过化肥, 让我放心吃。
我还是开了门,拿了张纸,让他们把那把礼物放在了一张洁白的A6纸上。 
那把花生和枣我没有吃,我就放在那里,看着。他们都光溜溜的,泛着光,很心想的样子,一般大小的个头。很饱满。 
房东终于找上门了,开门见山的第一句话就是:是不是你家新住进一个人?我愣了好大一会,才想起来,可能是保安跟他说了。 
我把事情的来龙去脉解释了一下,并试图说服房东给隔壁的门也挂个号,房东不情愿的“嗯呢”了几声,便走了。 
第二天,我真的看到他们的门上贴了张纸,写着:清洁工具存放处。 
没过几天,我大学里的死party兼室友和她新结识的男友来广州找乐,我被迫请了一天假,陪他们。 
随便找了个馆子想请他们吃粤菜,可是朋友说粤菜没味,没吃几下,就嚷着走,后来还是不得不去了湘菜馆子,才算满足他们的胃口。吃完饭,没事,街上是不敢拎着包包闲逛的,就去了“钱柜”K歌,唱到一半,结果又使性子,非要去“朝歌”。弄来弄去,歌没唱好,还耽误了时间。 
晚上回来的时候,已经有些晚了。可是我看到隔壁的灯还亮着,屋里还嘤嘤的传来抽泣的声音。 
我没理会那声音,开了门,把朋友让了进去。朋友进门就开了电脑,把那首《不怕不怕》开的声音老大,震的整个房子都晃悠。 
楼下的终于忍不住了。来敲门,让我们动静小点。我关了音乐,跟朋友谈起了隔壁的那对小夫妻。朋友以为我在讲故事,一边说着无聊,一边就摸过烟开始吸。我最讨厌烟味,因为那能呛出眼泪。 
我赶朋友出门,让她在楼道里吸够了再回来。 
半支烟工夫,朋友死命的敲门,兴奋的叫着她男朋友的名字,说快出来听戏。 
他们俩出去,便没了声息。好久才回来。 
朋友一进来,就凑到我耳朵边说:你别假正经了,是不是每天晚上没事,就去隔壁听音乐啊? 我还没来得及反应过来,他们俩就大笑起来。没完没了的,怪烦人的。 
后来,我才知道,原来他们俩是去隔壁门口听动静去了。至于什么动静,我没问,但我想,应该与颜色相关。 
晚上睡不着拿起《洛丽塔》,看了两页,就开始走神。后来迷迷糊糊的睡着的时候,我似乎真的听到了隔壁的动静,声音不大,但很诱人。 
朋友呆了还不到3天,我就开始烦躁,我感觉那种以往的宁静被打破了,而且一个单身女人看到一对情人在你面前晃来晃去的亲昵,真的容易中风! 
送走他们,我开始变得神经质,我经常故意关门很大声,估计开开关关防盗门不停,故意想让隔壁听到我在发脾气,故意想让每个人都知道我心情很不好。 
隔壁的小夫妻还是每次看见我笑笑的,有点腼腆的羞赧。男人那头有点油腻有点乱的头发依旧还是在发梢上泛着或多或少的头皮屑,女人的马尾辫也依旧蓬松的拢在后面,有点像秋天乱飞的树叶。 
可是我见了他们,却没有笑,也不再板着脸,只是面无表情的点个头,用自己有力的鞋跟敲打着地面,匆匆离去。 
每次低下头,看着自己那8公分的高跟鞋,我才恍惚的感觉到,其实没有了这鞋跟,我似乎也不高! 
然后就是无休止的失落和郁闷! 我猜,他们一定是精心挑过了的。估计一麻袋里才能挑出这般的花生枣子吧。 
想到这里,我笑了。不大会,我又后悔起来,我真不该笑!
有这么几天,那扇门一直关的紧紧的,屋里也一直没亮过灯,我扒在门缝里瞅,竟然不能看到里面的任何东西。有几次,我甚至使劲贴着耳朵听,竟然也丝毫没听到任何动静。我开始害怕,担心他们不声不响的搬走了。 
我甚至开始抱怨,为什么走的时候没打声招呼。我不知所措,在房间里踱来踱去,狠命的撕扯着那个抱枕,用力敲打着键盘,写着一些很尖刻的文字,用蔑视的眼光看着周遭的一切。 
我发现我有好久没这么情绪激动过了,甚至应该说我有很多年没这么情绪化了。我突然伤感起来。似乎失去了什么珍贵的东西,似乎别人偷走了原本属于我的一份心情。我开始诅咒,开始谩骂,开始憎恨这个世界。 
我每天站在门口,期望着能突然有人站在我面前笑,我总是忍不住去瞄那扇门,希望能看到里面透出一丝淡淡的泛着黄晕的光。可是一连好几天,都没有。 
我终于还是跑去找了那个有点啰嗦的房东。我说我要租那个储藏室。房东讶异的看着我:你要住?我皱了皱眉,说:我要放沙发。房东似乎有点为难:你想什么时候租?我诧异了:难道现在还有人住么? 不是空出来了么?房东说:那对民工下个月到期。 
我忽然有种莫名的欣喜,难道还没走?我结结巴巴的说着:那下个月我租! 
等我再经过那扇门的时候,我有点高兴,因为我似乎看到里面锅碗瓢盘碰撞的声音,因为似乎我能听到他们的窃窃私语。 
那天,我睡的很早,我其实一点也不困。可是我还是早早的躺在了床上,我睁大了眼睛,看着天花板,想着有一次能有人敲我的门。 
一阵开门的声音惊动了我,尽管那声音小的还没蚊子“嗡嗡”声大,可是近几天我练就了一双聪慧的耳朵。我唰的从床上爬起来,冲了出去。 
那女人看着我当啷的一声开门声,吓得站在哪里不动了。我很尴尬,赶忙掩饰自己的那种激动:回来了?怎么这几天都不在?回老家了么?女人望了我半响,吞吞吐吐的说:还没睡呢,大姐。没,没呢,没回去。这几天有事。 
她第一次不是微笑着跟我说话,也是第一次没有过多的说什么,就进了那间我天天盯紧了的储藏室。 
我愣在那里,好久,好久,我才反应过来。我突然想哭,是那种有点委屈,有点付出了很多热情却被冷落后的难过。可是我没哭出来,也没掉泪,我只是关了门,打开了电脑,开始漫无目的到处游荡。 
那晚,我听到她一个人忙到很晚,丁零当啷的不知道是做饭还是收拾东西。 
听到那个屋里一直传来一个人的声响,我突然很奇怪,那男人呢? 
我孤单起来,感觉到寂寞的可怕,尤其是那隔壁的单调的动静,让我彻底的开始感觉到浑身冰凉。 
我突然意识到:原来一个人是这么凄清,这么荒凉的可悲。我裹紧了睡衣,可是仍旧无法驱散这午夜的孤寂。 
她似乎有点不好意思,在门口站了许久,没有敲门,也没有要走的意思,低着头,好像在思索着怎么开口。 
其实对于昨天那些简单的话语,在南方这个有点冷漠的城市,不算什么,客套显得奢侈,敷衍是每个人对周遭的理所当然的态度。可是我看得出来,她还并不适应这种人与之之间的冷淡和乏味的陌路。也许,她以为,在这里还是跟家里一样。可是,她单纯的,怎么能想象的出来在异地他乡很多时候人和人是没人情味可言的。 
我主动开了门,走了出去,看着她,等她第一个开口。 
她听到门响,忽的抬起头,眼睛里有点惊慌,有点不好意思的欣喜。她笑了笑,我明显的看到她的眼睛红红的,肿了,有哭过的痕迹。 
她微微点了下头:对不起大姐,平时你挺照顾我们的,昨天我心里难受,对你态度不大好,你别在意。我还有事,要赶着出门,没别的事,我走了。 
她转过身,我一把拉住了她。我第一次像对一个朋友那样的语气问到:出啥事了? 
她愣了,泪珠子像断了线一样,噼哩啪啦的掉下来,所有的委屈,压抑,和内心深处的痛苦,都随着眼泪倾泻下来。我毫无防备,她一下趴在我肩头,哭出声来。我没拒绝,轻轻的环住了她,想着也许这样能多少分担一些她那莫大的苦楚。 
她娓娓道来,我才知道,她老公住院了。 
他老公本来做业务员,可是由于本性木讷,不善于交际,所以业绩一直不好,只好辞职了,另找了份体力活暂时做着。由于体质不好,又加上吃的不好,每天都很累,那天,去上班,不小心被掉下来的砖头砸破了头,住进了医院。本来以为这算工伤,单位会报销医药费,可是单位不仅不管,还把他开除了。积蓄都花光了,她只好回来收拾收拾,然后去把老公接回来养伤。 
我拿出了张银行卡,想给她取点钱,暂时用着,她死活不肯,就一溜烟的跑下了楼。 
下午她和她老公就回来了,她老公的头上包着纱布,有气无力的样子,看到我,还是挤出了笑容。看着他那矮矮瘦瘦的样子,我似乎觉得他看上去没那么猥琐,尽管卑微,却很精神;尽管怯懦,却很坚强。我回了他一个微笑,这一次,我笑的很真,很用心。 
那一天,一整天,我心情都很好。这是我从来到这座城市后第一次这么开心,第一次这么用心的笑,第一次这么在乎自己是否笑的认真。 
那天,我看到了自己脸上掉下来的面具,赤裸裸的摆在我面前,露着森森白牙无力的呻吟,无力的挣扎,无力的哀嚎。 
而我,就那么漫不经心的,拿起打火机,点燃了它。 
我小心翼翼的敲开了他们家的门,女的不在家,上班去了,男的颤巍巍的站在门口,望着我傻乎乎的笑着,不知道该怎么把我让进门。 
我并没有要进去的意思,就那么直直的站在门口,像聊天一样,像跟家人朋友说起话来:你们单位叫什么名字?凭什么在你上班期间受伤不按工伤负责医药费?他们有什么理由开除你?按照《劳动法》你有权利......我话还没说完,他就傻傻的笑了,插嘴道:我知道,我也读过大学,我也懂法,可是没用的!《劳动法》也许真的能保障你们这些白领的合法权益,可是对于一个民工,是没有任何保障可言的。拿什么保障?谁给你保障?你找谁讨说法?什么这个机构,那个机构都去过了,磨破了嘴皮子,根本没人管!去单位,那些老板雇佣的打手不把你打残废算是幸运的了,再说,去挨顿揍,最后还是自己掏腰包看病,更不划算。算了,我认了,谁让咱没啥社会地位呢! 
听着他的叹气,听着他那些话语,我似乎感觉到了自己的幼稚,社会是残酷的,生活是残忍的。报纸上那些民工年年讨要工钱反被打,干了活拖欠工资,受了工伤没人管的新闻一幕幕浮现在我的眼前。我一下子开始清醒,社会就是这样的,你让这样的一个弱者去那里讨说法,你让这样的一个社会底层的人,拿什么来维护自己的权益? 
我不再言语,我感到了语言的苍白无力,我感到了词汇的贫乏,我也感到了自己那些不太现实的想法的天真。 
我有点虚弱的沉沉的叹息,呓语般的说:外面的社会太无奈,这么艰难,还是回去吧,与其这样备受凌辱和煎熬,不如回去过虽然贫困却有尊严的日子。 
他还是笑了,笑的有点无奈。他抬起头,望着远处,似乎在自言自语:回去?回去怎么办?欠的学费无论如何要还的,都不还,国家怎么办?国家在我最需要帮助的时候伸出了手,我不能忘恩负义,做人要厚道!何况家里还有弟弟妹妹在读书,父母也年迈了,身体又不好,不赚钱,怎么供弟妹?怎么养爹娘? 
做人要厚道!听到这句话,我惊呆了,一个生活这么艰难的人,一个沦落到社会最底层的人,竟然还想着国家,竟然做人的原则比我们这些衣冠楚楚的人都高尚。我开始感觉到自己似乎变小了,有些卑微。 
我睁大眼睛,看着他,有那种很敬畏的目光一直盯着他,耳朵里飘过的全是他那些幽幽道来的话: 
农村真的穷,很多人都说,穷还生那么多?其实,为什么要生了一个还要生一个?谁愿意那么穷还要养几个孩子,生活压力更大,可是没办法。被逼的啊!在农村,人老了,没劳动能力的,就等于开始要养个闲人,农村的老人没养老保险,没任何社会福利,也没任何生活保障。如果不多生孩子,老了后,一个孩子养不起俩人老,那还不得活活饿死,于是只好多生几个,分轻负担。养儿防老是农村不得已的传统! 
每个农村的父母都想自己孩子有出息,而想改变命运只有考大学一条出路,可是读大学却是很昂贵的,所以家里只要有一个考上大学的,全家都要遭殃,跟着砸锅卖铁的供着。可是现在大学生毕业工作很难找,尤其是读的学校不好,专业又不好,更难找;没拿到毕业证等于没上大学,去任何单位人家都要看你学历证书,没有,只能当民工。 
说到这儿,他很无奈的摇了摇头,用力的憋着嘴巴,不再言语。 
我也没说话,我不知道该说什么好,因为这是一个从小生活在城市里的孩子无法想象的,于是我选择沉默。也只能沉默。 
中午,我叫了两份快餐,我端了一份给他,他说什么也不要。我假装生气道:我打扰你一个上午,让你没好好休息,请你吃个快餐算是表示歉意!他推辞不掉,只好接过去了。 
我知道一个快餐,太寒碜了,可是我知道,如果过于奢侈的东西,他又怎么肯接受? 
晚上,女的很晚才回来,累的一身疲惫。我听到男的说:我给你留了好吃的,你饿了吧,快吃吧。女人坚持说吃过了,非要男的吃,因为男的有伤在身,需要营养。听着他们推来推去。我的眼眶湿润了。 
我知道,我又错了,我太不了解他们彼此的爱了,他们的爱是双份的啊!又怎么忍心一个人独吞一份自己认为是好的东西,而让另一个咽着口水眼睁睁看着呢? 
那天,我终于知道:两份爱的倍数很大,很大,很大。以至于我根本无法看到它的边际,无从理解它的内涵。 
男人终于慢慢的好起来了,等他完全康复的时候,我托朋友给他找了份稍微轻松点的工作,虽然赚钱不多,可是毕竟比先前的要好些。他们夫妻俩带着满怀的感激不知道说了多少遍:谢谢。尽管我一再说这是举手之劳,可是他们还是不停的说谢谢。弄的我都有些惭愧了。 
一个月后,男人和女人兴高采烈的跑来拽着我往外走,我还没弄清怎么回事,他们就把我拖出了门外。直到楼下,我才搞明白,原来男人发工资了,非要请我吃饭。我呵呵的笑着,说:不用客气了,都是出门在外,互相照应是应该的,吃饭就免了吧。可是他们固执的拉住我,非请不可,说:不请,于情于理都说不过去。看着我也一副坚决不去的样子,他们俩急了:你是不是怕我们带的钱不够,不看,我带了好几百呢。说着就要去掏钱。看着他们憨厚可爱的样子,我实在推辞不过,只好答应了。 
我一边走着,一边想着:怎么样才能既让他们请了我,了却了他们的心愿,又能为他们省钱。我想起了广州最便宜的饭馆,拉面馆。 
于是我装作沉思良久的样子说:我知道有个地方的东西很好吃,我最喜欢吃了。不如我们去吃兰州拉面吧。他们俩先是一呆,接着就说:那怎么行呢?怎么能请你只吃碗面呢?说啥也要请你吃顿好的。 
我故意很生气的样子:我就喜欢吃拉面,你们要是诚心请我,就请我吃拉面,要是吃别的,我可不高兴了。
他们俩看我生气了,只好答应着,说:一切都依着我。 
到了面馆,我点了一碗牛肉面,男的点了一碗素的,一碗牛肉的。等拉面端上来的时候,男人把最大的一碗带牛肉的面推到我面前,把另一碗有牛肉的端给他老婆,他自己的那碗却是碗小的素的。 
看着我疑惑的眼神,男的赶紧解释到:我喜欢吃素的。以前的伤口还没长好,吃荤的对伤口不好,素的好。 
其实我知道,这根本不关伤口的事,我知道他是为了省钱,可是他不会亏待朋友,于是只能亏待自己。 
看着他大口的吃着面,看着他老婆不停的把牛肉夹到他碗里,看着夫妻两人你不停的你把肉夹给我,我把肉夹给你;我的嗓子哽在那里,难受的咽不下去一口面。我能感觉到我的眼前一片模糊,不知道是面的热气扑在了脸上,还是有别的东西糊住了眼睛,能感受的只有一阵潮湿。 
第一次,我学着他们的样子,吃光了碗里的面,喝光了碗里的汤,尽管我撑的胃疼。可是我第一次能感觉到我内心深处很充实,很满足。 
虽然吃的是8块钱一碗的拉面,但是我知道这一餐很贵。那不仅仅是花去了他们好几天的生活费;让我得到的更不仅仅是饱饱的胃,而是我从未有过的感激和体会。这无论是多少钱都不能买得到的,也不是所有人都能得到的恩惠;那种价值只有人性中才有。 
我想,这是我至今为止吃过的最贵的一顿饭,它真的很奢侈,很昂贵。 
一个懒洋洋的午后,我的那个朋友给我打电话来,当我听完他的叙述,我吓呆了,我不知道他说的是不是真的,也没听清楚事情到底怎么回事,我只知道,我隔壁的那个男的被抓进了公共安全专家局。 
朋友不停的埋怨我,怎么会给这样的人介绍工作,言语间的不满,无疑是说,我让他帮忙找了这个工作,事情现在弄成这样,他在那个公司老板面前已经颜面尽失。听着他愤愤的挂断电话,我就知道,以后这个朋友算是没了,更别说再找他帮忙给那对夫妻介绍工作了。 
我已经来不及关心,这份或许叫友谊的东西还是否能完整的存在,也无心去跟这位朋友道歉,我只想知道他怎么样?我只想弄清楚事情到底是怎么回事。我在潜意识里竟然多了份对他的信任,我告诉自己,也许这是个误会。 
我请了假,急忙的赶回家,跑上楼,去敲那扇门,可是良久,都没人来开门。我有点失落,我想也许女的已经赶去公共安全专家局了。 
我无力的靠在那里,望着隔壁我的门,突然伤感起来。我看到了我门框上贴着一张纸条,我跑过去,撕下来,是女的给我留的言。上面没说什么事,只是留下了一个***的地址。我来不及多想,便赶去了那个***。 
赶到那里的时候,我看到两个**正在对女的训话,女的低着头,忍住抽泣,耸动的肩膀似乎在极度的压抑着将要哭出来的声音。旁边还坐着一个中年妇女。那个中年妇女频频的皱着眉头,尽量的让身子往一边靠,唯恐女人那身有点破旧的衣服玷染她。我冲过去,拉住女的胳膊问道:到底出了什么事? 
两个**先是打量了我一番,沉吟了半响,然后口气缓和的问道:你是?我没看他们一眼,自顾的说:我是**晚报的记者,她是我的朋友,我想来找她了解一下情况。 
两个**互相看了一眼,半信半疑,但是又似乎不敢冒险,于是姿态便低了下来,不再大声的吼着对女人训话,对我也客气的套起交情来。 
我把女人拉到一边,问她到底是怎么回事,她老公在哪里?女人看着我,还没开口,眼泪就刷的掉了下来,我安慰她不要哭,先把事情跟我说清楚,我们再想办法。 
原来事情是这样的,今天上午,他老公去为公司的一个客户送资料,在公共汽车站等车的时候,正巧遇到“飞车party”抢劫正在等车的一个妇女的包。妇女拼命拉住自己的包哭喊,却没有一个人去管,正在双方你争我夺,僵持不下的时候,他看到了,想都没想,就冲过去,帮妇女夺包。无论贼人怎么打他,甚至拿出了刀子,可是他还是拉住包不放手,这时候执勤**赶来,“飞车party”便逃窜了。 
本来事情就这么简单,可是当**赶来的时候,看着他也在夺包,以为他是抢劫犯的同伙,就问那个被抢的妇女,认不认识这个男的,妇女一口咬定不认识,并且还强调:她也不知道这个男的是“飞车party”同伙,还是另一伙抢劫犯,反正跑上来就夺她的包。**二话不说,就带走了男人。 
由于男人着急给客户送资料,所以再怎么解释都没用,挨了匪徒的打也就罢了,竟然还被**猛揍一顿,让他老实交待。他怕耽误公司交待的任务,只好报出了公司的名字,本想着这样只是可以赶紧让公司派人来把资料及时转交给客户,没想到,公司一听,立马不承认他是本单位的人,也就是说他立马就被开除了。 
**通知了他的老婆,他老婆一来,就被定性为:抢劫犯家属。不停的被训话,还让她交待问题。她吓得不知道说什么,脑袋一片空白,要是我不来,她真的不知道该怎么办? 
听完她的叙述,我一股无名火就上来了。我转身到那位妇女旁边:请问,你就是受害人?我想采访一下您,这是我的工作证件。妇女愣了,不知所措的看着我,我不理会她的莫名其妙,继续问道:请你详细描述一下当时的情况,你为什么就认定这个帮你夺包的人也是抢劫犯,为什么你就不能认为他是来帮你从匪徒手上夺回包的人呢?
妇女,看了看我,又看了看**,慢吞吞的,结结巴巴的说:怎么可能有那么好的人?这年头,谁还爱管闲事啊?难道他不怕死?他要是真帮我,那他不是傻子就是精神有问题。pol.ice听着,也频频点头,似乎她说的才是一个正常的人所应该做的。 
看着他们理所当然然的表情,我愤怒了,我大吼起来:他如果是抢劫犯的同伙,为什么抢劫犯打他?他如果也想抢你东西,为什么pol.ice来了不跑?在pol.ice来之前那会,他完全可以抢了你东西就跑?你东西少了么?他打你了么?有目击证人可以证明他也是在抢你包么?你们pol.ice有什么证据证明他就是抢劫犯?是因为他没有这个城市的户口?还是因为他穿着不够华丽?一个冒着生命危险帮你忙的人,你竟然还要指责他是抢劫犯?如果是你被冤枉,你会怎么样? 
我深深吸了口气:你们在没证据的情况下,就抓人,就非法拘留,你们这是犯法!我指着那个妇女:你这样不识好歹,分不清好人坏人,你不觉得惭愧么? 难道你也要教育你的孩子,事不关己?高高挂起? 
所有的人都愣在那里,不说话,我知道,在这样一个治安混乱,世风日下,人心不古的城市,在这样一个,人与人之间冷漠的不带丁点温度的社会,在这样一种你被欺负,我无视的风气下,没有人开始相信善良,也没有人会去相信会有人无私去帮助别人,甚至当你去好心的做一件你认为对得起良心的事情的时候,在多数人眼里,那成了你伪善的最好外衣。 
pol.ice可以抓错你,法律可以错判你,可是你要想去纠正这个错误却不是一件简单的事情。 
抓错你,可以只是因为怀疑你,就能给你戴个嫌疑犯的帽子;疑罪从无在很多时候只是法律条文里的一句话而已,现实中能真正贯彻实施的屈指可数。判错你,可以有一万个理由归咎于司法的不健全,可是没有人会为你受到的不公待遇负责,提起国家赔偿,也只是说说而已,又有哪个人能真的得到过这样的道歉形式?! 
我知道,要给他洗清罪名,我必须全力以赴,我必须有足够的证据证明他是无辜的,他是好人,他当时是想去帮助那个妇女。 
尽管,现在妇女含糊其辞,已把自己搞糊涂了,自己也说不清楚他到底是不是来帮自己的等等理由来推脱,不想面对自己遇到好人,反咬一口的事实。pol.ice也以虽然没有证据证明他是抢劫犯,但是事关他出现在事发现场,并与此事有关联为由,不能彻彻底底的还他一个清白。 
我知道,要靠抓住当时的那两个抢劫犯来为他洗脱不白之冤可能性微乎其微,我只能想办法找其他证据。我利用自己是记者的身份,想尽办法,找到了当时事发现场的2个目击证人,是一个报亭的老头和一个推着车买水果的妇女。他们都说当时那男的的确是去帮被抢的妇女夺包,不是抢劫犯。可是当我想要他们陪我去趟***跟pol.ice证明一下的时候,他们却死活都不肯。说不想多管闲事,怕惹一身臊。在我苦苦哀求无果的情况下,我不得不耍了点小手段,与其说是手段,不如说是无奈之举。 
我说我是记者,现在要对那天发生的事件,写篇评论。广州街头一妇女被抢,好心人施救,反被诬赖是歹徒,旁观者无人肯出头!我还故意说:你们俩我也会以匿名形式将你们事不关己的态度写进去的,不知道你们的孩子看了,会有何感想。 
看着两人有点迟疑,我又说,如果你们肯证明,我当然也会在文章中把你们伸张正义,深明大义的善良举动报道出来的。我相信你们都是好人,都不会眼睁睁的看着另一个好人被诬赖受不白之苦的。 
他们掂量了很久,终于还是被我说动了。 
我又去找了男人公司的上司,尽管他很不情愿的开证明说那天的确是派男人去给客户送资料的事实,但是碍于我与他们老板朋友有交情的情面,还是开了。尽管,我也知道,那个原来的朋友其实也许已经没得朋友可作了。 
我找了律师,咨询了这方面的法律,托了很多朋友和同学,终于把男人弄出来了。 
尽管出来的时候,pol.ice没一句道歉的话,尽管那个受过他帮助的妇女没一个谢字。可是,我看得出来,他并没斤斤计较的去在乎。起码证明了他无罪,证明了他是个好人。 
当这件事发生的时候,我失去了原本可以称之为好友的朋友;甚至失去了以后可能再联系的可能。但是我得到的更多,更多,我得到了让一个好人恢复声誉的机会,我得到了去帮助一个值得去帮助的人幸运,我也得到了一份我对自己的由衷的感激。 
我不知道,他以后再碰到这样的事还会不会毫无顾虑的冲上去帮忙,也不知道他内心是不是已经开始对于做一个好人的概念有了新的诠释,可是我知道他本质的善良不会因此而动摇。 
可是无论怎样,也不管以后他会不会继续这样做,我们都没资格再去怪他,也没权利去让一个受过伤害的好人忍着痛再去迎头顶刀子!因为,那个拿刀子伤害他的人,其实就是我们,我们这些人,我们这个社会。 
天空飘着雨,有点阴霾,来来往往的人潮,冷着一张张没表情的脸,继续在这个城市生活着,没有人知道曾经发生过这样的一件事,甚至当初亲眼见过此事的人也许早已当作一个谈资将其遗落在脑后。 
世界忘记了,可是我记得,那天记得,岁月记得。
自此以后,那夫妻总是显得有点卑微,总是在感激了我之后,有点抬不起头来的难过。似乎全都是他们的错,似乎他给我们,给所有的人添了很大的麻烦一样。也许,真正善良的人都是这种心态,总是不停的从自身找原因,总是觉得如果我够好,又怎么会这样,却从来不去怪罪别人,不去把责任推卸到别人身上。 
我试图给男人再找份好点的工作,无奈,夫妻两人总是笑眯眯的说:不麻烦了,他们找到工作,已经在上班了。其实我心里明白,他们知道上次给我添了乱,是无论如何弥补不了的,尽管我不在乎,可是他们在乎,他们不想再来让我为难,所以便拼命拒绝我的好意。 
男人早出晚归,我想或许是真的找到工作了。看着他们每天筋疲力尽的样子,我心里酸酸的,却又不知道该如何帮他们。我第一次感觉到:那种无可奈何的难过,竟然是能折磨人的。 
元旦的时候,我在楼道遇到他们,夫妻二人高兴的跟我打招呼,说要出去吃大餐。看着他们有说有笑的出门,我心里不禁艳羡起来,也许在我们为他们难过的时候,他们却能找到属于他们自己的生活的点滴快乐和幸福。 
第二天,我一看到他们,就开始调侃:昨天去哪里吃的大餐?他们并没有不好意思,而是神秘的笑了,那笑有点天真,又有点温暖。女的趴早我耳朵边悄悄的说:大姐,你知道么?有种店,是一块钱吃到饱的!我惊诧了,睁大眼睛看着他们。 
在广州呆过的人都知道,有很多快餐店,为了吸引顾客,总喜欢在门口张贴着一块钱吃到饱的大条幅,可是我们每个去过的人都知道,那只是一种标语,真的进去消费了,是永远不可能会让你花一块钱吃顿饭的。说句实话,进去吃饭就算你一个人,吃下来,再怎么节省也要20块钱。何况是夫妻俩人一块去吃呢? 
我很怀疑的看着他们,他们似乎有点不好意思了,男人终于忍不住了说:真的,大姐;我们没骗你,我们昨天去吃过了,我们两口子一共就花了五块钱!我失笑出声:怎么可能,米饭一个人都要算两块钱呢,五块钱,你们吃的啥? 
女人嘿嘿的笑了:我们进去,看菜单,发现只有一种小菜是一块钱,就是花生米,这么小一碟。一边说着,她便用手比划着,其实她不比划我也知道那碟花生,估计一共不会超过10粒花生米。因为在餐馆里,这种一块钱一碟的花生米,只是为了响应他们的一块钱吃到饱的口号的。现实中真正去点这个菜的人屈指可数。 
女人还在眉飞色舞的说着:他们的例汤是免费的,一大盆呢! 反正米饭按人头算钱,一个收两块,我们俩就着花生米一人吃了四碗米饭,喝光了所有的汤,吃的饱饱的,只花了五块钱呢。 
说完,他们俩相视一笑,反而让我觉得不好意思起来。我不知道,他们是怀着多大的勇气,走进一个还不错的餐馆,坐下来,只点一碟花生米,却能吃完四碗饭的?我也不知道,他们在喝光免费的汤时, 一粒花生米就着一碗饭怎么就吃的那么满足,那么开心。 
我想,当时,肯定有很多人用异样的眼光看着他们,甚至还会有人窃窃私语的笑话他们老土;也许他们甚至能够听到别人侮辱的话语,也能看到别人鄙视的眼光,但是他们却还能继续坐在那里,吃完那顿饭,并且是高高兴兴的吃完,然后拿五块钱去买单。 
我并不觉得这样做有多么可耻,也并不觉得这样做会有什么不妥,拿五块钱来消费也是顾客,消费五块钱并不就比消费了50块的客人低一等。但是,无论什么时候,我们却往往看到在某些消费场合,似乎高消费更能得到好的周到的服务,又似乎有钱的更能得到尊重。 
我承认,如果是我,怀里揣着五块钱,是绝对不敢去这样的餐厅消费的,我没有勇气去只叫一碟一块钱的花生米,也许尽管我的食量只是一碗米饭加一碟花生米,但是我还是会要几个也许我根本不会动一筷子的奢侈的菜。其实内心也知道那是浪费,但是又有哪个人不喜欢用钱的浪费来购买自己面子的实惠呢? 
在这个社会,有钱的比没钱的说话更有底气,富有的比贫穷的更能得到别人的尊重,高高在上大都是有钱人,社会底层的都是贫困潦倒的。毕竟现在是商品市场的社会,经济类型决定了钱是多么重要,钱变成了自尊,面子的代名词。我们每天都活在赚钱买面子的日子里。在我们奢侈的去花大笔钱买所谓的面子的时候,我们是否会想起有那么一群人,还挣扎在温饱线上呢? 
月薪不如别人高感觉没面子,到现在还没有百来平方的房子感觉没面子,工作了几年还是普通职员也觉得没面子,看到别人的老婆比自己的漂亮也会觉得颜面尽失,甚至会因为别人的衣服比自己的名牌也会汗颜。我们活在一个面子至上的世界,那点卑微的自尊心总是遮掩着自己脆弱的颜面。回首已逝去的岁月,才发现其实活的并不快乐,是因为赚的钱太少了,买不起足够的面子?还是赚的钱买来的面子,遮住了自己的人性尊严? 
金钱,生存,面子,自尊;在人生的天平上,到底孰重孰轻?! 
年前,我懒洋洋的等待着春节的到来,想着是否该回家陪父母过年。在我犹豫了又犹豫的时候,我发现离过年还不到10天了,我想公司是非要靠到年前才肯放假的,想着又要买全价的飞机票,便在心里开始狠狠的想:明年一定不再磨蹭,提前俩月买票,估计就能买4折的飞机票回去了。 
就在我敷衍着年前最后几天的班,想着如何找个借口提前请假回家的那几天,我一直没看到隔壁的小夫妻。我以为他们早就回家过年去了。 
可是就在一天半夜,女的敲开了我的门。我睁开惺忪的眼睛,含糊的问着:有事么?女的显得很不好意思,说:对不起,打扰你了,我想让您帮个忙,听说民工能网上订票,你能不能帮忙看看?我答应着,让她进了门,我打开电脑,开始帮忙给她订火车票。可惜的是,网上订票是要民工单位团体订票,她和她老公的单位都没有人给他们订票,他们个人又没资格网上订。她看了看规定,很郁闷的走了。我迷迷糊糊的竟然忘记说句安慰她的话。 
第二天,我心里一直记得这件事,总觉得该做点什么。我从新闻上看到可电话订票,便匆匆记下了号码,准备给他们个惊喜。 
下班时间还没到,我就急忙赶回去了,我回去的时候,女人在家,我好奇她为何没去上班,但是我只顾着说电话订票的事,就没来得及问。男人不在家,我絮絮叨叨的跟女人说着电话号码,我还掏出自己的手机让她赶紧打电话订票。 
女人苦笑了一下,没接我的手机。眼里含着泪,哽咽着对我说:我就是因为打电话订票,被老板看到开除了。说着便苦起来:我这个月半个月的工资也没给,说我是违反规定了,不罚钱就算是宽大处理了。 
原来,女人也听人说,可以电话订票,从一大早起来就去IC电话亭打电话,可是总打不进去,就在中午吃饭时间,偷偷溜出去打电话订票,可是打通了就说票已售完。一连一个星期都是如此,女人实在没办法,只好在早上店里没客人的时候,用店门口那个公用电话继续打电话,8点半就打通了,女人高兴的不得了,以为这次终于可以订到票了,结果却说票已售完。票没订到不说,打电话却被老板正巧看到了,说她上班时间做私事,就把她炒了。无论女人怎么苦苦哀求,还是惨遭开除。 
我一边安慰女人:反正要过年了,也要赶着回家过年呢,不干了也好,明年回来找个更好的工作。一边说:要不再用我手机打打试试,说不定能订到票呢。 
女人摇着头:不可能的,我老乡电话打了十几天了,也没订到,就算早上八点一开通服务,你第一个打进去,也订不到票,因为这个列次的火车过年很紧张,不可能正当途径买到票。 
我以前只知道过年买火车票难,可是没想到这么难。我就问:去火车站排队买不行么? 不是听说那里很多票贩子么?实在买不到就买黄牛票吧。 
女人沉思半响,说:我老公已经在火车站排队排了半个月了,还没买到票呢。他白天请假去排队买不到,晚上就通宵不睡觉在那里排队买,还是买不到。票贩子天天看到我老公,主动找我老公说了好几次,说他们有票,保证真的,可是手续费太贵了,我们不舍得阿! 
我说:多少手续费?总不能比火车票价还贵吧!女人咧嘴笑了,那笑有点勉强:我们回去,坐硬座,票价才200多,可是手续费却要300,你说两张票连票钱加手续费就要1000多,我们一个月的钱啊。这不是喝我们血么?1000块钱,在我们老家,是一年的收入啊,我们怎么能舍得呢! 
听着她的话,我无语了。我突然感到很自卑,感觉自己竟然是那么浅薄,那么无知。 
为了两张回家的火车票,工作丢了,俩人日日夜夜去排队买票,拿着生活费去打那个比长途还贵的电话,半个月下来,得到的结果竟然是:票已售完。 
那么多火车票去哪里了? 为什么天天排队买票都说没票了,票贩子却又喊着:去任何地方都有票,手续费300元呢? 
到底,票都到了何人的手中? 又是怎样到了这些人的手中的呢?而那天价手续费的暴利到底在养活着谁? 
我气冲冲的拨通了火车站的服务电话,我刚说完车次,就被告知:春节前本次车票已全部售完,请转乘其他车次。 
我有些失望,试图劝说他们能不能转车回去?或者坐长途汽车?女人惨淡的笑了笑:大姐你别操心了,没法转车,能经过我们那个小地方的,就这一个车次,到别的地方倒车,也不好买票,还是回不去,汽车太贵了,都快赶上飞机票价了,不如走回去呢。说着还半安慰我似的开着这个黑色的玩笑。 
看着她紧锁的眉头,想着也许这会她老公还在火车站满怀着那么点希望排着队,等着老天爷大发慈悲,给他们两张回家的票,而我却还在犹豫着过年回不回去陪父母,想着回趟家真累,来回路上够折腾人的。
我开始觉得自己的卑鄙,甚至渺小。他们也许可以不回去,但是却非要坚持回去,是为了双方年迈苍老的父母?还是为了回去分担家里的忧愁?无论怎样,为了回去,却要付出这般代价,值得么?也许很多人不以为然,可是在亲情的天平上,这个砝码却很重。 
一张过年回家的火车票,就那么一张薄薄的纸片,不知道要费多少心,伤多少神,排多少个夜晚的队,付出多大的代价才能得到!那里面到底藏着多少回家人的血汗,又写着多少回家人无奈的眼泪?! 
我的飞机票已经订好了,全价! 
每到过年,航空公司都开始腰杆子硬起来,打死不打折,可是飞机票却依然紧俏,中国人都太恋家,过年花在回家路上的路费,也算是对拉动经济增长做点贡献了。
“铁老大”,仍然牛气烘烘的一边说着加开临时列车,又一边抱歉的告诉你:票已售完。 
隔比夫妻在轮班排队买票的情况下,还是没得到回家的那一张通行证。
他们天天在火车站等着,
盼着哪天能有个好心人来退票,可是这种奢望很渺茫,他们似乎也感觉到无力回天,除了等待奇迹,只能盘算着是不是真的要走回家。 
在此期间,我一直不停的在网络上搜索着关于这辆车次的消息。每次看到有人转让,我都急不可待的去联系,可是都是票贩子在打广告,手续费比票价都高,而且行情看涨,越来越高。 
我想帮他们出手续费,只要他们出票价,可是他们死活不答应,说是原则问题,就是走回去也不买高价票。他们很正式的跟我说:我们是中国公民,为什么坐车要买高价票呢?我们又不比别人低一等!难道我们没权利去享受一张正当价钱的票么?都去买高价票,以后就真的只有高价票,没有正当的火车票了,那些暴利养活的都不是好人,我们越这样养他们,他们越贪婪。 
听了他们的话,我沉默了。 
我突然害怕起这个有点病态的社会来,我怕那致命的细菌会感染我! 
我感到那么无能为力的难过,我很想为他们做点什么,可是我却到头来什么都没能为他们做,甚至只是两张火车票,我都不能帮他们。 
我最终没逃脱,找关系,走后门的那些俗套。我托了朋友,朋友又托了朋友的一个在火车站工作的朋友,费了九牛二虎之力才弄到两张硬座票。吃饭,应酬,说着冠冕堂皇的感谢的话,最后,终于在每张票多付了100元的情况下我才有机会把票握在手里。 
酒足饭饱后,那人打着酒嗝还在继续不停的说着:票是多么难买,别人多出300块手续费他都没给,因为看在老朋友面子上他就当免费帮朋友的忙。 
我只好用感激的眼神望着他,说着千恩万谢的话,用一种谢谢你的大恩大德的态度来应承他的恩惠。他满足的笑着,我也在心里满意的想着:有了票,他们终于可以回家过年了。 
当我把两张车票放在他们面前的时候,他们呆住了,用一种难以置信的崇敬的眼神望着我,良久都不说话。我笑着,什么话也没说。 
女人突然问道:你是不是买来的高价票?我摇摇头?那票是哪里来的?我笑了。我没说实话,我不知道为什么,在他们面前有些虚伪的实话是不需要说出来的。我告诉他们。票是我的一个同事的朋友买的,原本要回家过年,可是公司突然说有事,回不去了,只好转让票。结果正巧让我知道了,我就赶紧买过来给你们送过来了。我怕他们说钱的事,赶紧补充:票人家没多要一分钱,要不去火车站退票还要扣手续费呢,你们要了,正好解决了人家后顾之忧,人家还省钱了呢。 
他们高兴的说不出话来,一边把票接过去,反复的看着,抚摸着,一边掏钱给我。我说什么也不要。他们便怔住了脸,说我不要钱,他们就不要票。我没办法只好收下了钱。 
他们走的日子比我早,我去车站送了他们。我偷偷买了些广州特产和水果,在他们检票进去的时候,把东西塞到了他们其中的一个大编织袋里。 
看着他们拎着大包小包,里面装满的或许不是值钱的东西,但是脸上洋溢着的幸福的欢笑里,让人感觉那一切都很珍贵。 
他们不时的回头看看我,用拎着包的手用力的跟我挥手,咧嘴笑着,眼神里的光彩很温暖,我内心涌起一种莫名的感动。竟然有想哭的冲动,我忍住了,也笑着朝他们挥手。 
他们的身影渐渐消失在人群中,我没走,站在那里,我似乎听到了火车的鸣笛声,那一定是他们要回家的那列火车,那火车里一定有他们要回家的两个座位。 
归途很累,很遥远,可是回家的路却很温暖。 
我第一次觉得过春节不那么无聊,我第一次觉得来回的路上不那么劳累。整个年,我过的很快乐,当我再次回到广州的时候,他们夫妻还没回来。 
我想,他们一定是买不到火车票,要等过了高峰期才能返回。我安静的等在那里,看着那扇我隔壁的门,希望,在偶尔一天,能再看到那熟悉的身影。 
他们来的真的很迟,元宵节过后一个星期才姗姗来迟。我微笑着迎接他们,端去我买的汤圆,跟他们分享我所有的快乐。 
女人跟男人商量着:想推个小木车卖点水果或者小吃。问我的意见,我说好。与其给别人打工那么累,还不自由,倒真不如自己买点小吃赚钱好些。 
于是夫妻俩,便买了个二手的小木车,批发了点菠萝,西瓜,在家练熟了削菠萝和西瓜的技术,便开始上街卖起了西瓜菠萝,一块钱一块。白天女人一个人去,晚上,夫妻俩一起出门,广州这么乱,丈夫不放心,再晚都陪着老婆卖完了,再回来。第二天一早,又去上班。 
看着他们恩爱的每天出出进进,我由衷的羡慕却又高兴着,我想,就算苦,两个人分担开来,也是甜的!如果将来能有这样一个人对我说;无论痛苦灾难,我都会在你身边。我听了一定会哭着嫁给他,虽然我不知道要等这样的一个人等多久,但是起码有了憧憬,人便分外的有了希望起来。 
有时,很晚了,还没把削好的卖完,他们就拿回来,分给我吃。我每吃一块就会笑着对他们说:我又吃掉你们一块钱。 
其实我在心里明白,他们完全可以不用送给我吃,他们生活拮据,完全可以自己吃掉,剩下的又不多,水果吃了又对身体好,以前平时都不舍得买。可是他们仍然愿意分给我,因为,在他们的内心里,他们认为是好的东西,都愿意跟别人分享。 
记得以前,在学习和生活中,我们经常能接触到:无私,奉献,善良这些美好的字眼,可是不知道什么时候我们的周围发生了变化,在我们的字典里再也看不到那些美丽的东西,自私自利,冷漠,代替了那些小小的感动,成了我们的主流。
当我,又一次体会到这种久违了的感觉的时候,我欣喜若狂,像个孩子捡拾到了珍贵的宝贝,我想我一定好好珍藏起来,在哪天忘记的时候拿出来看看,提醒自己。 
那天,我下午回来,看到女人在家,很奇怪她没出去卖东西。就半开玩笑的说:老板,该开工了?怎么还没走?女人看到我,先是灿然的笑了笑,说:今天一天都没出去,做买卖的家什没了! 
没了?卖了?丢了?我连炮竹的问道。她说:昨晚,被城市管理者抓到了,都给砸烂了! 
砸烂了?凭啥?我气汹汹的问。她无奈的摇头,说:说是影响市容市貌,还影响环境卫生!他们没别的事,就是专门抓小商贩的! 
我惊呆了,抓小商贩的?我突然一阵悲哀,就算有一百个理由抓你们,也用不着砸打抢吧?! 跟别人说明白不就行了么?用的着这么土匪行为么? 
女人听了我的话,竟然笑了,说:我就心疼那菠萝西瓜,好好的,削好的被扔了,没削好的也被砸烂了扔的满地是,我倒糊涂了,是我们推小车卖西瓜脏呢?还是把西瓜砸烂在地上,弄的一地西瓜渣滓脏呢?! 
听着女人的疑问,我竟然不知道怎么回答! 
是啊,到底是谁更肮脏?是那卖西瓜的小贩?还是那砸西瓜摊的城市管理者? 
原本干干净净的一切,究竟谁是罪魁祸首,究竟是谁弄脏了我们的世界?!
35楼 
一辆花了一个月生活费买来的破旧的小木车,一堆花了半个月生活费买来的西瓜菠萝,竟然在光天化日之下,被一群同样跟你都叫做人的家伙砸了个稀巴烂,任由你苦苦哀求,任由你好话说尽,也任由你眼泪滂沱! 
无情的打砸把你要生存的一点点希望给砸碎,冷漠的言语将你最后的自尊践踏的体无完肤,吼来喝去的态度对你的乞求熟视无睹,就这样,在一个人人平等的社会里,你被人踩在了脚底下! 
我能想象的出,女人当时的那种心碎,那种绝望,那种甚至是可怜的尊严被践踏的伤悲。可是,就算我再怎么去理解,我却永远不能替代那种伤心欲绝的体会。也许,这就是人类的悲哀,一种你无论如何不能逾越,不能跨过的鸿沟,你只能去了解,却不能去感受。 
我无力的想着所发生的一切,却又无能为力的苦笑。我竟然想为她讨个说话的能力都没有,我感到了自己的有限,感到了自己总在接受了别人的恩赐后却不能报答的那种难受,那种矛盾的苦楚。 
我很想,再出钱帮他们买辆小车,可是女人说无论如何不敢去卖西瓜菠萝了,不是怕城市管理者,是受不了那种活生生的好东西被糟蹋的场面,是见不得那种一片狼藉的情景。
我尽量出些能赚钱的主意,女人说老乡帮她找了个发传单的兼职,不累,她想先做着。我看着她有些消瘦的脸庞,心很疼! 
想着这些天发生的事,我越想越上火,恨不得把这个世界洗刷一遍,可是只我一个人的眼泪不够,甚至全世界的人的眼泪也不够! 
我竟然气的牙疼起来,半边脸都肿了,疼的我食不下咽,鼻子也因为牙疼上火,流鼻血。我干脆请了假,去医院看牙。 
几天折腾下来,吃药,打针不管用,后来重新检查,又说牙疼发炎引起了这里毛病,那里毛病,然后又开始治疗,又一通打针,吃药,检查,再检查,结果还是没好,牙还继续疼着,我继续郁闷着。 
最后,医生觉得给我拔牙补牙!会更有效,又折腾了几天,总算开始转好。这一个牙疼,花了6000多块。我才知道,原来嘴巴里长的是28颗金豆子,贵着呢! 
可是看到新闻上那些天价医疗费,我又欣慰了,别人看个病都几百万呢,我才6000够便宜的了! 
我突然感慨起来,也许有的人能付得起天价医疗费,可是我付不起!也许我能付得起6000块钱的治疗牙疼的钱,可是有的人就付不起!和还有更多的人比我贫穷,还有更多的人看不起病!
看病贵,看病难,这已不是什么新鲜话题,可是这个根深蒂固的问题却始终没得到解决!我想到我们不远的邻国印度,它虽然还不太富有,虽然也人口众多,但是医疗制度却还完善,全民医疗免费。我不由的羡慕起来,不由的想着哪天我们也能享受到此等待遇! 
如果能有那么一天,我想,报道上就再也不会有某某小女孩得白血病家人倾家荡产筹钱治病,也不会有,,
生病是谁的错? 身体的错么?! 没钱治病是谁的错?家人的错么?!医疗费用居高不下谁的错?医生的错么?! 
也许谁都错了,也许谁都没错!
那天,我捂着半边脸,忍着隐隐作痛的牙,心里恨恨的想:这6000块钱算是白花了。 
女人自从摊子被砸了后,便兼职发传单,可是活儿并不是天天都有,所以也是有一天没一天的在家歇着。这天她看到我蹲在门口,抱着头不说话,吓坏了。 
她拍了拍我的肩膀,我抬起头,她才看到我的脸肿了。她心疼的问:怎么了?这是?我嘴里含糊不清的嘟囔着:倒霉啊,牙疼,快要老命了。 
她急忙问:看医生没?要不要紧?我从疼痛的牙缝里挤出简单的话:看了,没用, 白花6000块,现在是牙也疼,心也疼! 
女人让我张开嘴看了看,自语道:肿的很厉害,要从根里治,你等着。说完就一溜烟跑回家。 
不大会,女人端来一碗黑乎乎的汤水要我喝,我看着脏兮兮的,就皱起了眉头。女人硬逼着我喝下去。就这样,连续好几天,女人都让我喝那种苦苦的黑汤水。结果竟然消肿了,慢慢的牙也不怎么疼了。我想一定是那黑汤水起了作用。 
原来,女人怕在异地他乡生水土不服或者有个头疼脑热的,就从老家带了些中药过来,正好她老公有牙疼的毛病,就带了些这方面的中药。看到我疼的厉害,她就把那些药都熬了汤给我喝,没想到吃了几付,就好转了。 
我想着,她把药都熬给我喝了,万一哪天她老公牙疼,可怎么办?女人竟然笑笑:没事,他咬咬牙就挺过去了。我知道牙疼的滋味,所以心里还是后悔吃了人家的药。 
我问这药很贵吧?女人笑了:不值钱的,都是些花啊草啊的,家乡的山上多的是,又不是什么高科技生产出来的化学**,只几块钱一副! 
我开玩笑的说:几块钱?那我那6000块钱不是喂狗了?女人笑了:我们那里穷,人病去不起医院,只能找个老中医开点中药熬熬喝!6000块看个牙疼,就是村长一辈子也没这个福气!那要多少人家一年的收入呢。 
我听着女人的话,开始心凉凉的。6000块,这数字在我心里边格外沉重。 
女人突然问了一句:在这里的医院生孩子要多少钱?我沉吟了一下说:估计要个一万块吧!女人吓了一跳:一万块?那要是生完了就走,不住院呢?我想了想:也要好几千吧!女人愣了:马上要生了进医院,让医生帮忙接生出来,我立马走人,也要上万么?我不用他们啥东西,就借他们点时间,搭把手就行了。 
我没明白女人话的意思,也没往深处想,只是担心着那些月收入不足千元的民工的老婆,如果来到这大都市,不小心怀孕了;来不及回乡下老家生产,,他们要拿什么去进这大城市医院的大门,平安的把孩子生下来呢?! 
生存是人共同的权利,如果连生存都被剥夺,或者说为生存要付出惨痛的血的代价,这样的生存还能配的上人类赋予它的最初的意义么? 
一个生命,一颗牙齿,一句问话,告诉我:生存= 艰辛! 
看着自己滚圆的大腿,一天肥一圈的腰枝,近似蠕动的庞大躯体,我再也不能忍受**渐臃肿的躯体。我决定要减肥! 
减肥,对于一个有些懒惰的人来说,是很困难的事。克服这个问题,需要一个支撑点,我想到找一个人监督,或者找一个人陪我减肥来调动我的积极性。 
我脑海里蹦出的第一个人,就是隔壁现在不用忙着上班的女人。我毫不犹豫的告诉了她我的想法,她没迟疑就答应了。 
从此,她每天早晚都陪我跑步,陪我做运动。每次我都自嘲的跟她开玩笑:我真残忍,找你这么一个皮包骨头的瘦子跟我一起减肥!她总是安慰我:锻炼身体有益健康是好事,不管胖瘦运动都有好处。 
我心安理得的每天让她陪着我,看着她越来越瘦,我又不免内疚,可是每次她的笑脸却又把我的那点愧疚吹的荡然无存。我只好总是借口减肥,把好吃的,好喝的都给她,她不要,我就生气,她没办法只好收下,眼里却总是满是不好意思的感激和受之有愧。于是她用更拼命的陪我运动来偿还我对她的那点小小的恩惠。 
我做梦也没想到,愚人节后的第二天,她来告诉我:她要回老家了!我以为她在补上愚人节没给我开过火玩笑的机会,可是我错了,她是真的要回家!因为她怀孕五六个月了! 
她本来是打算在这边生的,后来听我说到生孩子估计都要上万的,就下决心提前回老家,在老家待产。怕再晚,挺着临盆的大肚子坐火车不方便,所以才决定现在就走。 
我惊呆了,不知道该说什么;我满脑子浮现的都是,她怀孕了,我还让她陪我做剧烈运动的镜头!我感到自己的可恨,一个怀孕五六个月的女人,挺着隆起的肚子天天陪在我身边,我竟然视而不见,是我自私到只考虑自己?还是我冷漠到忘记了他人死活? 
想着她每天笑靥如花,从来没表现出半点怨言和不高兴,我第一次感到自己的可恶。我开始鄙视自己,憎恨自己那种习惯于接受别人付出的不良嗜好。 
看上去,她更瘦了,于是我更痛恨起自己来。也许她每天没命的跟我锻炼,回家却吃不饱,第二天却要半饿着肚子继续陪我运动,肚子里还有一个消耗着营养的胎儿,这是怎样的一份艰辛的心情?这是怎样的一种残忍的场面? 
当我大吃大喝,山珍海味的把自己喂养成一个十足的胖子,却要求一个每天吃不饱,饿着肚皮的孕妇跟我一起运动减肥?!这就是人性的自私,这就是我的自私到极点的本质的最有力说明。 
我不得不承认,自始至终,我并没高尚到哪里去,我还是那个第一次见他们的时候的那个龌龊的人,尽管极力想用帮助别人来掩盖自己的哪些自私的本性,可是还是失败了,本质像个烙印,已经刻进了我的灵魂深处! 
面对这着这样一个残酷的事实,我开始无地自容,我突然感觉我根本配不上做他们的朋友,尽管我曾那么的想,但是我不够格,也没资格去填下那份上帝面前的契约,我只是个自私的懦夫,我没权利要求灵魂对我有任何丝毫的原谅! 
我被自己重重的摔倒在地上,被人性的刀子割的体无完肤。那感觉很痛;很麻木! 
我的所有的思想,他们并没有任何的觉察,只是用一种悲伤的情绪跟我道别。 
女人是一个人走的,为了省钱,女人死活没让男人送。 
我不知道一个挺着肚子的女人,拎着大包小包好几个,在熙熙攘攘的人群中是怎样挤上了火车,又是怎样的一个人孤孤单单的回到了家。但是,我知道,如果是我,我做不到,不是没勇气,是没那个能力! 
没几天,男人就搬走了,因为他觉得一个人住个几百块的房子不划算,赚的钱都搭在住上了,为了省钱,他选择了免费的,和一群民工一起住在一个桥下搭的窝棚里。男人临走的时候,我给了他一个信封,信封里有一封我写给他老婆的信和一张银行卡。我叮嘱他,无论如何,回家的时候记得把信带给他老婆。他点头答应着,很坚定的说:保证完成任务。 
从此我隔壁的储藏室空出来了,房东说我可以放我那张旧沙发了,可是我没放,只是在每次经过的时候,都会停下来,默默的盯着房门看很久,很久。 
从那以后,我再也没见过他们夫妻二人。我不知道男人还在不在他说的桥下的窝棚里住着,也不知道他有没有时间回老家一趟顺便把我的那封信交给他老婆,更不知道在那个我连名字都叫不出来的他们的老家,他的老婆是否安好。 
只是,从他们离开后,我开始喜欢穿平跟鞋,因为那感觉很踏实。 
踏实到,我想着明天开始一个人学会为自己的心灵搬家。

posted @ 2011-09-11 19:04 陈晓 阅读(341) | 评论 (0)编辑 收藏

2011年8月9日 #

spy++和游戏修改器

这几天做了两个东西,spy++ 和游戏修改器。 spy++ 就是模仿 vs的那个工具spy++ 。游戏修改器,就是暴力搜索内存,找到我们关心的数据,然后进行更改。
总之这些东西做过之后感觉就是都不难,但是在做的时候多少会感觉点吃力。唉,功力不够啊。继续修炼……
闲下来无事,记录下它们的过程吧。
spy++ 分析(用vs2005做的——)
spy++ 需要拖动一个小图标 然后移动到别的窗口上(本窗口也可以),然后画出窗口的矩形,得到窗口的一些信息。
拖动的这个小图标,是一个picture conctrl控件 ,属性的type改成icon 也就是加载一个icon图标,在属性imag里把图标选上。
给这个控件添加一个类,在这个类里做这个控件的 小图标拖动操作,即 lbuttondown的时候 把鼠标加载成 小图标,把picture里的icon换成空心的。
当鼠标抬起的时候把鼠标换回来原先的光标,然后再把picture里的icon换成有小图标的那个图标。
这里要主次 要把鼠标设成全局有效,要不然的话,鼠标位置出了这个picture的范围就失效了。函数是 SetCapture()
然后再lbuttonup的时候记得 要释放。ReleaseCapture();
           就是这几个图标。吼吼。
把这个小图标托到 窗口上的时候怎么在窗口上画出矩形呢? 
当然是先得到这个矩形了。我要先得到这个窗口的句柄,我们才能得到windowrect 然后才能画。
所以各 下一步就是WindowFromPoint(Point)传一个鼠标点 然后得到这个点的window的hWnd了 哈,很强大的函数啊。
得到窗口句柄就好办了。GetWindowRect得到矩形区域啊,然后用windowdc 画,用windowdc的原因就是,我们要在整个桌面上都能画。
这里画这个矩形有个技巧,我们要画出来,但是当我们不需要这个矩形的时候我们还要给这个颜色画回原来的背景色。这里算是整个程序的一个难点,考验画图工夫。
dc设备中默认选入的是一个黑色画笔,一个白色画刷,也就是说正常我们画矩形的话会画出黑边白底得矩形,现在我们要透明的底,然后画的黑边还要可画回原先的背景色。有一个函数通过dc调用  dc.SetROP2(R2_NOTXORPEN);参数传这个同或运算,这个函数的意思就是,拿你设备中的画笔画刷 去跟背景色运算,同或运算。
比如背景有个颜色是10010100011   你的画刷颜色是白色 也就是111111111111(比如就这么多位)  白色因为是255,255,255所以都是1  
然后进行同或运算得到的是什么?是10010100011(同或,同则1,不同则0)!也就说 还是背景色,这就做到了画刷透明。然后画笔是黑色,0000000000
跟背景色同或运算的到得是01101011100 这个。然后这个就是真正画到屏幕上显示出来的颜色。怎么在把这个颜色画没呢?大家在用这个黑色的画笔画一下,在同或运算看看结果是什么?10010100011 看看是不是又变回去了?吼吼。等会下面贴代码画图这里的。
这个画图就完事了。而且窗口句柄我们也通过windowfrompoint得到了。有了窗口句柄我们能得到很多东西了。
比如说窗口类名GetClassName
窗口标题GetWindowText
窗口矩形GetWindowRect
窗口id等信息GetWindowLong
进程id   GetWindowThreadProcessId
进程路径 OpenProcess()   GetModuleFileNameEx();

还可以向窗口中发消息 sendmessage(这个比较好玩,可以拿你的spy++去关闭别人的窗口。
然后把他设置到窗口上就可以了。
代码贴一小段。

void CMyPic::OnTimer(UINT_PTR nIDEvent)
{
    POINT p;
    ::GetCursorPos(
&p);
    hWnd
=::WindowFromPoint(p);
    CRect rect;
    ::GetWindowRect(hWnd,
&rect);
    CWindowDC dc(NULL);
    CPen redpen(PS_SOLID,
3,RGB(255,0,0));
    dc.SelectObject(
&redpen);
    dc.SetROP2(R2_NOTXORPEN);
    dc.Rectangle(rect);
    
//显示回去 就向没画一样
    Sleep(300);
    dc.Rectangle(rect);
    ReleaseDC(
&dc);
    CStatic::OnTimer(nIDEvent);
}

这个画图在timer里画,能做到 闪动的巨型。(我选的红色画笔,你可以把红色跟背景同或算算,跟黑色是一样的,在画一次就能画回来背景色)
下面的代码是 写我的spy++的第一页的代码

void CMyspyDlg::UpdataWindowNormal(HANDLE hWnd)
{
 CString str;
 int state=((CButton *)GetDlgItem(IDC_CHECK1))->GetCheck();
 //窗口句柄
 if (state==BST_CHECKED)
 {
  str.Format(_T("%p"),hWnd);
 }
 else
 {
  str.Format(_T("%d"),hWnd);
 }
 m_TabCtrl.m_dlg[0].GetDlgItem(IDC_EDIT_HANDLE)->SetWindowText(str);
 //窗口类名
 TCHAR tempTC[50];
 GetClassName((HWND)hWnd,tempTC,49);
 m_TabCtrl.m_dlg[0].GetDlgItem(IDC_EDIT_CLASSNAME)->SetWindowText(tempTC);
 //窗口标题
 ZeroMemory(tempTC,100);
 ::GetWindowText((HWND)hWnd,tempTC,49);
 if (*tempTC==_T('\0'))
 {
  m_TabCtrl.m_dlg[0].GetDlgItem(IDC_EDIT_TITLE)->SetWindowText(_T("无"));
 }
 else
 {
  m_TabCtrl.m_dlg[0].GetDlgItem(IDC_EDIT_TITLE)->SetWindowText(tempTC);
 }
 //窗口矩形
 CRect rect;
 ::GetWindowRect((HWND)hWnd,&rect);
 str.Empty();
 if (state==BST_CHECKED)
 {
  str.Format(_T("x=%x,y=%x,width=%x,hight=%x"),rect.left,rect.top,rect.Width(),rect.Height());
 }
 else
 {
  str.Format(_T("x=%d,y=%d,width=%d,hight=%d"),rect.left,rect.top,rect.Width(),rect.Height());
 }
 m_TabCtrl.m_dlg[0].GetDlgItem(IDC_EDIT_WINRECT)->SetWindowText(str);
 //窗口id
 str.Empty();
 LONG l=::GetWindowLong((HWND)hWnd,GWL_ID);
 str.Format(_T("%ld"),l);
 m_TabCtrl.m_dlg[0].GetDlgItem(IDC_EDIT_WINID)->SetWindowText(str);
 //进程id
 DWORD dword;
 ::GetWindowThreadProcessId((HWND)hWnd,&dword);
 str.Empty();
 if (state==BST_CHECKED)
 { 
  str.Format(_T("%p"),dword);
 }
 else
 {
  str.Format(_T("%d"),dword);
 }
 m_TabCtrl.m_dlg[0].GetDlgItem(IDC_EDIT_PROCESSID)->SetWindowText(str);
 //程序路径
 HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dword);
 TCHAR src[200];
 GetModuleFileNameEx(hProcess,NULL,src,199);
  m_TabCtrl.m_dlg[0].GetDlgItem(IDC_EDIT_PROSRC)->SetWindowText(src);
}

======================================================================
效果图

======================================================================

好了 下面记录下游戏修改器
其实我用的方法很笨的,但是比较简单。改成功了植物大战僵尸中的太阳值。
=======================================================================
效果图

=======================================================================
这个游戏修改 就是读内存,值进行比较,然后找到一些跟你输入的值相同的地址,记录在链表中,然后让这个值变化,在对链表进行搜索
如果链表中的地址中的值也变化了,正确的地址就在这链表里,继续变化值,之后最后地址确定下来为止,地址确定下来之后就可以修改了。
其中用到得函数 先是 快照,(我在前面做任务管理器中写到过) 得到进程id 进程名等。
然后用openprocess打开方式用要可读,可写,或者获得所有权PROCESS_ALL_ACCESS。得到进程的句柄。
然后通过进程的句柄读进程中的数据ReadProcessMemory因为虚拟内存共有4gb  后2gb是系统用,还有前多少K(不同系统不一样)也系统用。所以我们只搜索前两gb ,但是前面那些系统的我们就忽略了,毕竟是小数,不在乎多读那点了。
ReadProcessMemory这个函数第一个参数是进程handle,第二个参数 是基址(即从那个位置开始读,是一个地址),第三个参数是读出的buff 第四个是读的大小。 由于内存页是4kb 我们为了读的速度快 所以我们每次就读4kb。 读出这4kb 放入buff中 然后 拿我们要找的数值比如是100,(我们假定我们的数是2字节),在4kb中1字节1字节的向后走,两字节两字节的比较 如果等于100则加入链表
DWORD dOneGB=1024*1024*1024;//1gb的地址
 DWORD dBase=0;//基址是0
 DWORD dOnePage=4*1024;//一个内存页4kb
 BYTE buffer[4*1024];//装一个内存也
 WORD value;
 CString str;
 int pos=0;
 POSITION listpos;
//得到我们窗口上输入的值 value
 GetDlgItem(IDC_EDIT_INPUT)->GetWindowText(str);
 value=_wtoi(str);
 for (dBase;dBase<dOneGB*2;dBase+=dOnePage)//遍历2gb每次 加一页  4kb
 {
  if(ReadProcessMemory(hProcess,(LPCVOID)dBase,buffer,4*1024,NULL))//读一个页,因为这个读取是不一定成功的所以加if(有的内存系统不让你读)
  { 
//进行比较 如果相同加入链表CList m_Data;
   for(DWORD b=0;b<dOnePage-1;b++)
   {
    WORD tempword=*((WORD *)(buffer+b));
    if (tempword==value)
    {
     if (pos==0)//如果是头结点就 加在头上,之后就加在后边
     {
      listpos = m_Data.AddHead(dBase+b);
      pos++;
     }
     else
     {
      listpos = m_Data.InsertAfter(listpos,dBase+b);
     }
    }
   }
  }
 }

这样这个第一次搜索就完成了。搜出了一堆 等于100的值 的地址,放入了链表
下次就是   改变100为150,然后再链表中搜索等于150的。
int dataCount=m_Data.GetCount();
 pp=m_Data.GetHeadPosition();
  for (int i=0;i<dataCount;i++)
  {
   DWORD tempvalue=m_Data.GetNext(pp);
//根据基址读出两个字节的数,然后跟value比较
   ReadProcessMemory(hProcess,(LPCVOID)tempvalue,&buff,2,NULL);
   if(buff==value)
   {
   if (head)
   {
    li.AddHead(tempvalue);
    head=FALSE;
   }
   else
   {
    li.AddTail(tempvalue);
   }
   }
  }
哈哈,然后最后就搜到了那个值得地址,,然后根据这个地址改变 其中的值就行了

WriteProcessMemory(hProcess,(LPVOID)address,&newValue,2,NULL);
思路倒是很简单,写的时候总会出错误,或是内存错误或是中断的,要耐心调调。
为了植物大战讲师的无限阳光,吼吼。go


 

posted @ 2011-08-09 15:06 陈晓 阅读(3874) | 评论 (8)编辑 收藏

2011年8月1日 #

进程通信——邮槽和命名管道

今天记录下自己学的邮槽和命名管道,学习过程中遇到点问题也拿出来分享下。哈  开整
先说一下大体的概念奥。

邮槽定义

邮槽(Mailslot)也称为邮件槽,是Windows 提供的进程间通信的手段,

其提供的是基于不可靠的,邮件槽只支持单向数据传输,也就是服务器只能接收数据,而客户端只能发送数据,

何为服务端?创建邮槽的那一端就是服务端。
还有需要提及的一点是,客户端在使用邮槽发送数据的时候只有当数据的长度 < 425 字节时,

才可以被广播给多个服务器,如果消息的长度 > 425 字节的话,那么在这种情形下,邮槽是不支持广播通信的。
这是我看到的邮槽的简要说明吧。
先说下邮槽的使用过程吧。然后再分析函数,在贴代码。非常简单哦
服务端:                                        客户端:
首先创建邮槽CreateMailslot               打开油槽CreateFile
读取数据 ReadFile                           写入数据WriteFile
完事了,只有这四个函数。也很容易理解。 客户端写入数据 服务端读取数据。
CreateMailslot(_T("\\\\.\\mailslot\\chenxiao"),0, MAILSLOT_WAIT_FOREVER,NULL);
第一个参数是个固定格式\\.\\mailslot\\name   点代表本机。mailslot是硬编码 不能变,name可以自己起个邮槽的名字。‘\’放入字符串中要用转义字符\
所以就写成了"\\\\.\\mailslot\\chenxiao"
第二个参数To specify that the message can be of any size, set this value to zero. 设置成0
第三个参数为了下面的读取操作应该等待的时间 MAILSLOT_WAIT_FOREVER 传这个代表参数代表永久等待。
最后一个参数安全属性 嘎嘎 null
ReadFile(hMailSlot,pData,sizeof(TCHAR)*80,&dByteRead,NULL);
这几个参数很简单了。第一个参数就是创建邮槽返回来的句柄 第二个参数一个[out]buffer用来接收从邮槽中读出来的东东。第三个参数就是读取多少个字节。
第四个参数基本没用,是一个[out]的LPDWord  很蛋疼只能DWORD dByteRead; 然后传个他的地址。
因为msdn上说了If lpOverlapped is NULL, lpNumberOfBytesRead cannot be NULL;
lpoverlapped就是我们的最后一个参数,这个参数可以设置同步和异步,如果文件打开模式是FILE_FLAG_OVERLAPPED这个的话,我们这个就不可以是NULL
这个同步异步问题我在下面的命名管道中在说。这里就先过去。这个参数设成NULL。
客户端函数
CreateFile(_T("\\\\.\\mailslot\\chenxiao"),GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL);
这几个参数也很容易理解了。第一个参数要和创建邮槽的时候的参数一样。如果要远程通信的话可以把‘.’设置成服务器 主机名 或者在一个区域内广播‘*’
但是我用两个机器实验了,没有成功,目前我只能用邮槽在本地一个机器上通信。。。尴尬。。有知道怎么在两个机器上通信的,要给我留言教教我哦。
后几个参数根据参数名大家就可以猜个差不多了,我就不说了。吼吼。
WriteFile(hMailSlot,str,sizeof(TCHAR)*80,&dByteWrite,NULL);这个函数 跟 readfile差不多 就是向邮槽中写入数据用的。
第二个参数是要写入的内容,第三个是大小(以字节为单位).
好了这几个函数都说完了。贴上小代码,就清晰了。

//服务器端 我用的c++写的。
#include <iostream>
#include 
<Windows.h>
#include 
<tchar.h>
using namespace std;


int main()
{
    HANDLE hMailSlot
=CreateMailslot(_T("\\\\.\\mailslot\\chenxiao"),0,
        MAILSLOT_WAIT_FOREVER,NULL);
     TCHAR pData[
80];
     ZeroMemory(pData,
sizeof(TCHAR)*80);
     DWORD dByteRead;
     
while(1)
   
{
         BOOL b
=ReadFile(hMailSlot,pData,sizeof(TCHAR)*80,&dByteRead,NULL);
          wprintf_s(_T(
"%s\n"),pData);
     }

    
    system(
"pause");
    
return 0;
}
//客户端我在mfc中写的。
void CclientDlg::OnBnClickedButtonSend()
{
     TCHAR str[
80];
    ZeroMemory(str,
sizeof(TCHAR)*80);
     GetDlgItem(IDC_EDIT_INPUT)
->GetWindowText(str,70);
     DWORD dByteWrite;
     HANDLE hMailSlot
=CreateFile(_T("\\\\.\\mailslot\\chenxiao"),GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,
         FILE_ATTRIBUTE_NORMAL,NULL);
    
if (hMailSlot==INVALID_HANDLE_VALUE)
    
{
        MessageBox(_T(
"createfile失败,请打开服务器"));
        
return ;
    }

     BOOL b
=WriteFile(hMailSlot,str,sizeof(TCHAR)*80,&dByteWrite,NULL);
     GetDlgItem(IDC_EDIT_INPUT)
->SetWindowText(_T(""));
     CloseHandle(hMailSlot);
}


这就是运行结果啦。这个东西没啥大用。就是学习一下而已。以后万一用到也能弄弄。

下面我说下命名管道。这个东西坑了我一下午。。。
邮槽建立的是无连接的通信。。那么命名管道 就是有链接的可靠的通信了。他跟邮槽挺相似的。但是比邮槽好很多。
同上面。我粘一些概念性的东西。

命名管道是通过网络来完成进程之间的通信的,命名管道依赖于底层网络接口,

其中包括有 DNS 服务,TCP/IP 协议等等机制,但是其屏蔽了底层的网络协议细节,

对于匿名管道而言,其只能实现在父进程和子进程之间进行通信,而对于命名管道而言,

其不仅可以在本地机器上实现两个进程之间的通信,还可以跨越网络实现两个进程之间的通信。

命名管道使用了 Windows 安全机制,因而命名管道的服务端可以控制哪些客户有权与其建立连接,

而哪些客户端是不能够与这个命名管道建立连接的。

利用命名管道机制实现不同机器上的进程之间相互进行通信时,

可以将命名管道作为一种网络编程方案时,也就是看做是 Socket 就可以了,

它实际上是建立了一个客户机/服务器通信体系,并在其中可靠的传输数据。

命名管道的通信是以连接的方式来进行的,

服务器创建一个命名管道对象,然后在此对象上等待连接请求,

一旦客户连接过来,则两者都可以通过命名管道读或者写数据。          

命名管道提供了两种通信模式:字节模式和消息模式。

在字节模式下,数据以一个连续的字节流的形式在客户机和服务器之间流动,

而在消息模式下,客户机和服务器则通过一系列的不连续的数据单位,进行数据的收发,

每次在管道上发出一个消息后,它必须作为一个完整的消息读入。

我相信很多人看了几句就跳到这里来了。。概念性的东西 确实太不好玩了。我也不爱看。。哈哈
介绍命名管道需要的函数。
服务器端

CreateNamedPipe 创建命名管道

 ConnectNamedPip  连接
ReadFile    读
WriteFile  写

客户端

WaitNamedPipe 查看命名管道
CreateFile  打开命名管道
WriteFile ReadFile  写   读

就这些东西,今天由于不仔细看msdn 写程序写蒙了。。。等会我在说啊。大家要注意哦。
CreateNamedPipe(_T("\\\\.\\pipe\\chenxiao"),PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,PIPE_TYPE_BYTE,1,1024,1024,2000,NULL);
很多参数啊!不怕不怕 慢慢来
第一个我略过了哦。第二个大家在msdn上可以看到有
PIPE_ACCESS_DUPLEX   读写双向
PIPE_ACCESS_INBOUND   数据只能从客户端到服务端
PIPE_ACCESS_OUTBOUND  和上面那个相反
这个参数我们设置成 第一个。然而通过msdn大家可以看到这个参数可以附加 flag  我们就附加FILE_FLAG_OVERLAPPED 这个了
MSDN那一大堆英文我也瞅不太明白,大至意思就是这个呢 用了这个参数 程序操作读,写,连接等操作,可以立马返回。比如说读一个大文件吧

你把这个文件从头读到伟 需要很长时间。这样的话你的readfile函数就不会反回  就会阻塞在那里一直读。这样很不好,所以有了这个参数。这个参数就是使你的读 写 等待函数立马返回,这个就属于程序的异步,这个读函数和主程序一起执行。
下一个参数就是以字节流还是消息方式发送文件 读取文件。我们采用字节流方式PIPE_TYPE_BYTE。
下一个参数是最多可以创建几个命名管道 比如我们设置成3,就是可以创建3个这样的管道。我们这里设置成1,我们只用一个管道做演示就行。然后是分配的输入 输出 缓冲区大小 ,就类似创建线程时分配栈空间大小一样。然后是一个超时时间设置 这个设置成0就可以。最后一个NULL安全属性

ConnectNamedPipe服务端的连接管道函数这个函数两个参数第一个参数句柄,第二个参数一个结构体对象
这个结构体呢 里面有一个事件句柄。刚才上边由于设置了异步,所以你要有一个标志着读结束的标志,这个标志就用的这个事件。创建这个事件要设置成手动的,初始为无信号。

这样服务端的就写完了。
然后再说一下客户端的函数
WaitNamedPipe(_T("\\\\.\\pipe\\chenxiao"),0);
这个函数呢就属于一个查看函数,看看有没有叫chenxiao的命名管道
大家不要认为这个函数可以打开命名管道 或者连接管道
大家从msdn上可以看到这句话If the function succeeds,the process should use the CreateFile function to open a handle to the named pipe
今天我由于没看到这句话苦苦弄了一个下午也没连上管道5555555555
在客户端可以用waitnamedpipe检查下有没有这个管道 然后再createfile打开它。
哦了 搞定了。搞上我的代码瞅瞅效果。

 

//服务器端的代码  MFC写的

void CPipeServerDlg::OnBnClickedButtonCreate()
{
    m_hNP
=CreateNamedPipe(_T("\\\\.\\pipe\\chenxiao"),
        PIPE_ACCESS_DUPLEX
|FILE_FLAG_OVERLAPPED,
        PIPE_TYPE_BYTE,
1,1024,1024,0,NULL);
    
if (m_hNP==INVALID_HANDLE_VALUE)
    
{
        MessageBox(_T(
"创建管道失败"));
    }

    
else
    
{
        MessageBox(_T(
"创建管道成功"));
    }

    
//连接-----------------------------
    
    OVERLAPPED op;
    ZeroMemory(
&op,sizeof(OVERLAPPED));
    op.hEvent
=CreateEvent(NULL,TRUE,FALSE,NULL);
    BOOL b
=ConnectNamedPipe(m_hNP,&op);
    
if (WaitForSingleObject(op.hEvent,INFINITE)==0)
    
{
        MessageBox(_T(
"connect成功 haha"));
    }

    
else
    
{
        MessageBox(_T(
"create fail"));
    }

}


void CPipeServerDlg::OnBnClickedButtonWrite()
{

    TCHAR buff[
100]=_T("来自服务器的信息");
    DWORD d;
    WriteFile(m_hNP,buff,
200,&d,NULL);
}


void CPipeServerDlg::OnBnClickedButtonRead()
{
    TCHAR buff[
100];
    ZeroMemory(buff,
200);
    DWORD d;
    ReadFile(m_hNP,buff,
200,&d,NULL);
    MessageBox(buff);
}

 

//客户端的代码 MFC写的


void CPipeClientDlg::OnBnClickedButtonOpenpipe()
{
    BOOL b
=WaitNamedPipe(_T("\\\\.\\pipe\\chenxiao"),0);
    
//BOOL b=1;
    m_hFile = CreateFile(_T("\\\\.\\pipe\\chenxiao"), 
        GENERIC_READ 
| GENERIC_WRITE,
        
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    
if (!b||m_hFile==INVALID_HANDLE_VALUE)
    
{
        MessageBox(_T(
"连接失败"));
    }

    
else
    
{
        MessageBox(_T(
"连接成功"));
    }

}


void CPipeClientDlg::OnBnClickedButtonRecieve()
{
    TCHAR buff[
100];
    ZeroMemory(buff,
200);
    DWORD d;
    ReadFile(m_hFile,buff,
200,&d,NULL);
    MessageBox(buff);
}


void CPipeClientDlg::OnBnClickedButtonSend()
{
    TCHAR buff[
100]=_T("client's message");
    DWORD d;
    WriteFile(m_hFile,buff,
200,&d,NULL);
}

下图程序运行效果图

哇卡卡阿卡














 

posted @ 2011-08-01 22:14 陈晓 阅读(5245) | 评论 (6)编辑 收藏

2011年7月31日 #

进程通信——剪贴板

由于在启动一个进程后,操作系统会给这个进程分配 4GB 的私有地址空间,至于为何有 4GB 这么大,

那得考虑进程的私有地址空间和实际物理内存地址空间之间的映射以及页交换等等细节问题了,这里不予讨论,

既然操作系统给每一个进程分配的是私有地址空间,自然,这段地址空间也只有这个进程自己才能访问了,
既然这段私有地址空间只能由进程本身访问,那也就说明别的进程是不能够随意的访问这个进程的地址空间的,

而上面又说任意两个进程之间是并能够互相访问对方的私有地址空间的,都不能访问了,那还通信个屁啊 ?

自然上面的访问对方进程的私有地址空间是行不通了,那应该还有其他办法的 !!!

如果我在物理内存中划分出一块内存,这一块内存不为任何的进程所私有,但是任何的进程又都可以访问这块内存,

那么 进程 A 就可以往这块内存中存放数据 Data ,然后 进程 B 也是可以访问这块内存的,从而 进程 B 就可以访问到数据 Data 了,

这样不就实现了 进程 A 进程 B 之间的通信了 !!!

而上面的这种思路就是剪贴板了。

当然解决进程间通信还有好几种思路,本文暂只介绍利用剪贴板来实现进程间的通信。
前面
这段话是我抄过来的,呵呵,自己写不了这种书面语。
我写一下我对剪贴板的使用,我也是新学的,有不对的地方还请大家指点。

向剪贴板中写入数据
打开剪贴板 OpenClipboard
清空剪贴板 EmptyClipboard
设置剪贴板数据SetClipboardData
关闭剪贴板CloseClipboard

从剪贴板读取数据
打开剪贴板 OpenClipboard
判断数据类型IsClipboardFormatAvailable
得到剪贴板数据GetClipboardData
关闭剪贴板CloseClipboard

我在说下具体的函数怎么用
Openclipboard大家在msdn上可以看到 仅有一个参数hWndNewOwner
这个参数表明那个窗口拥有剪贴板的使用权 已在此窗口中打开,别的窗口中调用openclipboard就会失败
这个参数可以设置成null。If this parameter is NULL, the open clipboard is associated with the current task
呵呵,这个设成null之后 在后边的 setclipboarddata 就不能采用延迟发送了。因为……等会说延迟发送就会知道了。(这是我试验得出的结论,应该没问题)
这个参数我们暂且设为窗口句柄 m_hWnd(我用的MFC编的)
EmptyClipboard这个函数就没什么说的了。就是清空剪贴板的数据 还有就是The function then assigns ownership of the clipboard to the window that currently has the clipboard open.
SetClipboardData( UINT uFormat, HANDLE hMem);
有两个参数第一个参数是数据类型 我们设置成CF_UNICODETEXT。
第二个参数是the hMem parameter identifies a memory object, the object must have been allocated using the function with the GMEM_MOVEABLE flag.
这句话得意思就是 hmem是块内存对象的句柄 这块内存要是GMEM_MOVEABLE 型的。这又要引进一个申请内存的函数。平常我们用的malloc new 等都是
在自己的进程中申请空间,如果用他们 我们的通信也就通不成了。所以我们要申请个全局的内存空间
GlobalAlloc(GMEM_MOVEABLE,dwBytes);第一个参数就是可移动的意思(当别人申请一块大空间的时候 比如我们申请的空间比较散乱占用了一部分空间 别人就申请不了一整块大的空间了。这样我们的空间如果是可移动的,就会被移动的凝聚一些,别人就有地方申请大的空间了,红色是我们申请的凌乱的空间,绿色是又想申请的一大块)。

这个我不在这里多讲,内存管理我懂的也不太多。不懂的可以找找内存管理方面的书。 第二个参数就是空间大小。

这样我们完成了设置剪贴板数据 ,然后我们关闭剪贴板就行了。
读取简单一些。
::OpenClipboard(m_hWnd)
IsClipboardFormatAvailable(CF_UNICODETEXT)//判断剪贴板内数据类型
HANDLE hClip=::GetClipboardData(CF_UNICODETEXT)//得到剪贴板的句柄
然后就是使用里面的数据了。这里要注意,一定要给数据上锁 ,就是说我们在使用数据的这个时间内,别人不准移动我们的内存。这个大家能理解吧。
TCHAR * p=(TCHAR *)GlobalLock(hClip);//强制装换成我们的宽字符  上锁
MessageBox(p);输出即可
  GlobalUnlock(hClip);  解锁
  ::CloseClipboard();
这就完成了,我贴一段代码上来哦

//这个是写入剪贴板
    if(!::OpenClipboard(m_hWnd))
    
{
        MessageBox(_T(
"打开剪切板失败"));
    }

    ::EmptyClipboard();
      CString str
=_T("hahaaha");
      HGLOBAL  hG
=GlobalAlloc(GMEM_MOVEABLE,sizeof(_T("hahaaha"))+2);
      _tcscpy_s((wchar_t 
*)GlobalLock(hG),sizeof(_T("hahaaha"))/2+1,str);
      GlobalUnlock(hG);
    ::SetClipboardData(CF_UNICODETEXT,hG);
    ::C
//这个是从剪贴板中读出数据
if(!::OpenClipboard(m_hWnd))
         
{
             MessageBox(_T(
"打开剪切板失败"));
            
return ;
         }

        
if (::IsClipboardFormatAvailable(CF_UNICODETEXT))
    
{

        HANDLE hClip
=::GetClipboardData(CF_UNICODETEXT);
        TCHAR 
* p=(TCHAR *)GlobalLock(hClip);
        MessageBox(p);
        GlobalUnlock(hClip);
        ::CloseClipboard();
    }

    
else
    
{
        MessageBox(_T(
"剪贴板的内容不是unicode"));
    }


然后最后我在说说延迟发送setclipboarddata 的第二个参数传为null 就为延迟发送
延迟发送就是一开始点写入剪贴板的时候不写入,然后另一个进程想要得到剪贴板里的信息的时候也就是在getclipboarddata时
系统会发个消息给我们以前的那个窗口 还记得openclipboard传的那个m_hWnd了吧,就是给这个窗口发个消息WM_RENDERFORMAT
然后你在这个消息响应函数中进行把数据写入剪贴板。
还有一种情况就是你在想粘贴的时候  你的原先写入的那个程序已经关闭了,这样的话你就帖不了了。 这样 还有一个消息
如果你选择了延迟发送 然后关闭应用程序的话,就会响应一个WM_RENDERALLFORMATS消息 那么你在这个响应函数中把你要写入剪贴板得数据
写入 就可以避免这种情况了。
啊 累死我了,可下写完了。。。。




posted @ 2011-07-31 17:11 陈晓 阅读(1996) | 评论 (0)编辑 收藏

快照、用进程快照,和模块快照做个简单的任务管理器

得到系统中的进程信息
CreateToolhelp32Snapshot 快照  
此函数能得到系统中的所有进程 所有模块 信息等
然后用Process32First得到快照第一个节点信息(快照得到的东西相当于链表)
用此可以实现一个windows任务管理器。
用mFc写的。
//把ListCtrl的表头做出来
CListCtrl * m_pListCtrl=new CListCtrl;//m_pListCtrl要类的全局变量哦 
m_pListCtrl->Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT
,CRect(50,50,590,350),this,IDC_LIST1);
m_pListCtrl->SetExtendedStyle(m_pListCtrl->GetExtendedStyle()|
LVS_EX_HEADERDRAGDROP|LVS_EX_FULLROWSELECT|
LVS_EX_TWOCLICKACTIVATE|LVS_EX_UNDERLINECOLD);
m_pListCtrl->InsertColumn(0,_T("进程名"),LVCFMT_LEFT,120);
m_pListCtrl->InsertColumn(1,_T("进程ID"),LVCFMT_LEFT,70);
m_pListCtrl->InsertColumn(2,_T("线程数量"),LVCFMT_LEFT,70);
m_pListCtrl->InsertColumn(3,_T("路径"),LVCFMT_LEFT,340);

//读取所有运行中的进程 和进程名字 加入到 ListCtrl中
   m_pListCtrl->DeleteAllItems();//先清空里面的所有item 一开始是没有的,但是也要写一下。
HANDLE hSnapProcess=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//创建进程快照
HANDLE hSnapModule;
PROCESSENTRY32 pe;
MODULEENTRY32  me;
ZeroMemory(&me,sizeof(MODULEENTRY32));
ZeroMemory(&pe,sizeof(PROCESSENTRY32));
me.dwSize=sizeof(MODULEENTRY32);
pe.dwSize=sizeof(PROCESSENTRY32);
int pos=0;
Process32First(hSnapProcess,&pe);//从线程快照中读取第一个进程信息
CString strTemp;
do 
{
hSnapModule=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pe.th32ProcessID);   //根据进程id创建模块快照
m_pListCtrl->InsertItem(pos,_T(""));     //插入一个item
Module32First(hSnapModule,&me);        //读取模块中的信息  只有一个模块。因为是根据具体进程创建的模块快照
m_pListCtrl->SetItemText(pos,0,pe.szExeFile);   //设置的进程名
strTemp.Format(_T("%d"),pe.th32ProcessID);
m_pListCtrl->SetItemText(pos,1,strTemp);   //进程id
strTemp.Format(_T("%d"),pe.cntThreads);
m_pListCtrl->SetItemText(pos,2,strTemp);    //线程数
m_pListCtrl->SetItemText(pos,3,me.szExePath);   //进程exe路径
} while (Process32Next(hSnapProcess,&pe));//读下一个进程

在写个关闭进程 的按钮
void CProcessManagerDlg::OnBnClickedButtonClose()
{
    
int iMark=m_pListCtrl->GetSelectionMark();
    
if(-1!=iMark)
    {
        CString  str
=m_pListCtrl->GetItemText(iMark,1);
        HANDLE hProcess
=OpenProcess(PROCESS_ALL_ACCESS,FALSE,_wtoi(str));
        DWORD dExitCode;
        GetExitCodeProcess(hProcess,
&dExitCode);
        TerminateProcess(hProcess,dExitCode);
        m_pListCtrl
->DeleteItem(iMark);
        str.Format(_T(
"%d"),--count);
        GetDlgItem(IDC_STATIC_COUNT)
->SetWindowText(str);
    }
    
else
    {
        MessageBox(_T(
"没有选中进程"));
    }

}

  嘿嘿,看看这个图 还是挺好的。

   



posted @ 2011-07-31 14:34 陈晓 阅读(2197) | 评论 (0)编辑 收藏

2011年7月30日 #

多线程、事件event

就是自己随便做的笔记,可能对不起观众了。只是记录了用的函数。具体使用方法还是看下msdn
创建CreateThread 参见msdn  要记得closehandle

mfc 创建线程 afxbeginthread

创建事件 createevent

等待函数WaitForSingleObject   自动事件有信号 经过等待函数变成无信号。

线程退出,写在timer中 隔一段时间一检测。可以用多等待 WaitForMultipleObjects返回WAIT_OBJECT_0时则为所有事件都为有信号状态。


线程同步 

临界区法

定义临界区CRITICAL_SECTION m_critical;

InitializeCriticalSection(&m_critical) 初始化临界区

EnterCriticalSection(&(p->m_critical));进入

LeaveCriticalSection(&(p->m_critical));离开

DeleteCriticalSection(&m_critical)释放

事件法

定义自动变换事件m_hEvent

WaitForSingleObject(m_hEvent,INFINITE);

//被保护的代码

SetEvent(p->m_hEvent);

互斥对象法

穿件互斥对象 createmutex

等待函数WaitForSingleObject

//被保护的代码

释放互斥对象使用权ReleaseMutex

信号量  semaphore内核对象
CreateSemaphore(安全性,初始话信号量,最大信号量,name)
经过wait函数信号量减少
releaseSemaphore(句柄,信号增加量,【out】前个信号量)

 

 

利用事件判断应用程序不能运用两个
createevent的最后一个参数name 写一个“唯一的”
然后再创建的这个时间 用“唯一的”这个名字  就会出错
用getlasterror 能得到ERROR_ALREADY_EXISTS  
整个过程应该在app 的init中进行

posted @ 2011-07-30 14:32 陈晓 阅读(655) | 评论 (0)编辑 收藏

总结的几个排序算法

快速排序:
思想 一个标记数(取数组最后一个数)  左边放比他小的所有数 右边放比它都大的数
这样分成的两个数组 在进行 尾部一个数作为标记数作为标记分割数组
一直到分不了为止  自然就排好了续   用具体数字分析一下
一个数组char data[9]={2,5,8,3,7,6,1,9,4};
分开这个数组 看好了怎么把比4小的数都放到它前边
 int biaoji=data[8];//最后一个数
 int weizhi=data[j];//这个一个位置数 一开始把它放在最前边 j会++
 data[i];//这个是用来遍历数组的。i会++
for(int i=0;i<8;i++)//因为最后一个数是标记 所以只要对前8个数进行遍历就行
{
 if(data[i]<biaoji)
 {
   交换data[i]和weizhi
   位置的j++ 位置向后走一位(这个位置就意味着比标记小的数都放到位置的左边边) 
 }
}
在分开之后 我们要把我们的标记(也就是最后一个数)和我们的位置数 换一下
这样就做到了这样的事 把{2,5,8,3,7,6,1,9,4} 换成了{2,3,1,4,7,6,8,9}
好了 上代码 在看看代码相信 就都会了。
这是我用c++实现的代码 哈哈写完了感觉很爽!

#include <iostream>
using namespace std;
//得到分割点 把小于最后一个数的数放在i前边
//iData 是数组{2,5,8,3,7,6,1,9,4} iBegin是开始的索引0  iEnd是结束的索引8
int getCutpoint(int * iData,int iBegin,int iEnd)
{
  int iCut=iData[iEnd];
  int i=iBegin;
 int temp;
  for(int j=iBegin;j<iEnd;j++)
  {
   //如果前面的比最后一个iCut小的话,那么让
   //iData[i]和iData[j]换
   if (iData[j]<=iCut)
   {
    temp=iData[i];
    iData[i]=iData[j];
    iData[j]=temp; 
    i++;
  }
  }
  //交换最后一个与i处也就是cut处
  iData[iEnd]=iData[i];
  iData[i]=iCut;
 return i;//返回分割的索引
}
void fastSortCallBack(int * iData,int iBegin,int iEnd)
{
 if (iBegin>=iEnd)
 {
  return;
 }
 int i=getCutpoint(iData,iBegin,iEnd);
 //回调继续getcutpoint左部分
 fastSortCallBack(iData,iBegin,i-1);
 //回调继续getcutpoint右部分
 fastSortCallBack(iData,i+1,iEnd);
 return ;
}
void fastSort(int * iData,int iLength)
{
 fastSortCallBack(iData,0,iLength-1);
}
int main()
{
 int d[9]={2,5,8,3,7,6,1,9,4};
 fastSort(d,9);
 for (int i=0;i<9;i++)
 {
  cout<<d[i]<<" ";
 }
 system("pause");
 return 0;
}

 


选择排序:
选择排序和冒泡排序思路上有一点相似,都是先确定最小元素,再确定第二笑元素,最后确定最大元素。这个方法比较简单,他的主要流程如下:
1.加入一个数组A = {5,3,6,2,4,7},我们对他进行排序
2.确定最小的元素放在A[0]位置,我们怎么确定呢,首先默认最小元素为5,他的索引为0,然后用它跟3比较,比他打,则认为最小元素为3,他的索引为1,然后用3跟6比,发现比他小,最小元素还是3,然后跟2比,最小元素变成了2,索引为3,然后跟4比,跟7比。当比较结束之后,最小元素也尘埃落定了。就是2,索引为3,然后我们把他放在A[0]处。为了使A[0]原有数据部丢失,我们使A[0](要放的位置) 与A[3](最小数据的位置)交换。这样就不可以了吗?
3.然后我们在来找第二小元素,放在A[1],第三小元素,放在A[2]。。当寻找完毕,我们排序也就结束了。
4.不过,在找的时候要注意其实位置,不能在找A[2]的时候,还用A[2]的数据跟已经排好的A[0],A[1]比,一定要跟还没有确定位置的元素比。还有一个技巧就是我们不能每次都存元素值和索引,我们只存索引就可以了,通过索引就能找到元素了。呵呵。
5.他和冒泡的相似和区别,冒泡和他最大的区别是他发现比他小就交换,把小的放上面,而选择是选择到最小的在直接放在确定的位置。选择也是稳定的排序  ,这个还是很好实现的。

void SelectSort(int* pnData, int nLen)
{
    //i从[0,nLen-1)开始选择,确定第i个元素
    for (int i = 0; i < nLen - 1; ++i)
    {
        int nIndex = i;
        //遍历剩余数据,选择出当前最小的数据
        for (int j = i + 1; j < nLen; ++j)
        {
            if (pnData[j] < pnData[nIndex])   
            {
                nIndex = j;
            }
        }
        //如果当前最小数据索引不是i,也就是说排在i位置的数据在nIndex处
        if (nIndex != i)       
        {
            //交换数据,确定i位置的数据。
            int nTemp = pnData[i];
            pnData[i] = pnData[nIndex];
            pnData[nIndex] = nTemp;
        }
    }
}

 


插入排序:
思想,从第二个元素开始向后遍历,然后跟前面比较,如果比前边的元素小则向前插入
由data[1]和data[0]比较 如果data[1]<data[0]则data[0]后移一位 然后data[1]插入到data[0]位置
当然了,在data[0]后移的时候要用temp 记录data[1]的值
这样继续下去……
if(data[i]<(data i 前边的元素))
{
  data i 前边的元素就后移
}
最后把data[i]放到该插入的地方去 下面献上一点点代码 其中主要不好弄的是在头部
比如{3,4,5,6,2,1} 这个2 和 1 向前插入的话2 比第一个数3还要小 所以他下一步就要去
和索引为-1的数比较,这是不允许的。所以……如下
void insertSort(int * pData,int iLength)
{
 //从第二个元素开始 向前插
 int temp=pData[1];
 for (int i=1;i<iLength;)
 {
  for (int j=i-1;j>=0;j--)
  {
   //如果temp比前边的大,则前边的后移 最后把temp放在前面
   if (temp<pData[j])
   {
    pData[j+1]=pData[j];
     if (j==0)
     {
      pData[0]=temp;
     } 
   }
    else
    {
     pData[j+1]=temp;
     break;
    }
   
  }
  
  temp=pData[++i];
 }
}

 

 

希尔排序

待学习。

 


堆排序!!!!!!!!!!

 还不会呢。。

 

冒泡排序  略……

posted @ 2011-07-30 14:29 陈晓 阅读(281) | 评论 (0)编辑 收藏

仅列出标题